程序的机器级表示——基础

计算机执行的是机器代码,机器代码是二进制文件,既程序。机器代码用字节(1Byte=8bit)序列编码低级的操作,例如数据处理,管理存储器,从存储设备取数据等。使用高级语言(c,c++等)编写的程序(文本形式)最终需要被编译成机器代码才可以被计算机执行。当使用GCC c编译器来编译c语言代码时,会首先将其编译成汇编语言形式的内容,然后c编译器调用汇编器和连接器来最终形成计算机可执行的机器代码。汇编语言代码是机器码的文本形式,是机器码(字节序列)的文本助记形式。现在的要求是可以理解经过编译器优化过的汇编代码。

在Unix/Linux系统中,gcc是默认的编译器,也可以使用cc命令来调用gcc编译器。gcc命令实际上调用了一系列的程序来完成程序的编译工作。首先,c语言预处理器扩展程序源代码,插入#include加入的文件的源码,扩展使用#define声明的宏。然后编译器将源码文件编译为汇编语言文件(file.s形式),接下来编译器将汇编代码文件编译为目标文件(file.o形式),目标文件中的内容是目标代码,目标代码是机器码的另一种形式,它包含所有指令的机器码形式,但是没有填入地址的全局值,最后,连接器将目标文件与实现库函数的代码合并,形成最后可以执行的代码文件。

计算机系统为程序提供各种各样的抽象来屏蔽实现细节,对于机器级编程来说,提供的抽象属于比较低级的抽象。对机器级编程最重要的为两个抽象。第一个抽象是机器级程序的格式和行为,定义为指令集体系结构(instruction set architecture,ISA),它定义了处理器状态,指令的格式和行为,以及每条指令对状态的影响。大多数ISA(包括IA32和X86-64)将指令的执行描述成顺序的,但是实际上计算机系统并行的执行很多条指令。但是提供给机器级程序的抽象使得每条指令像是顺序执行的。第二种抽象是存储器地址是虚拟地址,机器级程序将存储器看成是一个大的字节数组,但是实际上存储器系统是由多个硬件存储器和操作系统软件组成的。

相对于c语言程序,IA32代码差别很大。许多对c语言屏蔽的细节在IA32程序中是可见的。(1)PC:程序计数器,保存下一个执行指令的地址(IA32中用%ebp表示)。(2)整数寄存器文件,包括8个命名的存储器(存储位置),分别存储32位的值,这些存储器存储地址或者整数数据。(3)浮点数存储器存储浮点数据。(4)条件码寄存器:保存最近执行的算术或者逻辑指令的状态信息,它们用来实现控制或者数据流中的条件变化,比如说if或者while的实现。

同时,相对于c语言,机器码不区分数据结构,机器码只是将存储器(内存)看做连续的字节数组,c语言中的聚合数据类型,例如数组或者对象,在机器码中只是一组字节。程序存储器(内存)中存储的信息主要包括:程序的可执行机器代码,操作系统需要的一些信息,用来管理过程调用和返回的运行时栈,以及用户分配的存储器块(比如使用malloc库函数申请的块)。操作系统负责管理地址,用于将虚拟地址映射到存储器的真实物理地址。

时间: 2024-10-22 08:22:26

程序的机器级表示——基础的相关文章

深入理解计算机系统之程序的机器级表示部分学习笔记

不论我们是在用C语言还是用JAVA或是其他的语言编程时,我们会被屏蔽了程序的机器级的实现.机器语言不需要被编译,可以直接被CPU执行,其执行速度十分  快.但是机器语言的读写性与移植性较高级语言低.高级语言被编译后便成为了汇编语言,汇编语言十分接近机器语言.之后汇编代码会转化为机器语言.虽然现代  的编译器能帮助我们将高级语言转化为汇编语言,解决了不少问题,但是对于一个严谨的程序员来说,需要做到能够阅读和理解汇编语言.我们主要围绕Intel来讲  解. 一  Intel处理器的历史演变 Inte

第三章 程序的机器级表示

程序的机器级表示 3.1历史观点 8086—〉80286—〉i386—〉i486—〉Pentium—〉PentiumPro—〉Pentium—〉Pentium—〉Pentium4—〉Pentium4e—〉Core 2 Duo —〉Core i7 3.2程序编码 1.gcc -01 –o p p1.c p2.c      使用第一级优化 2.程序计数器(%eip)指示将要执行的下一条指令在存储器中的地址. 3.寄存器文件 4.-S:C语言编译器产生的汇编代码 例:gcc -01 –S code.c

深入理解计算机系统(第二版)----之三:程序的机器级表示

计算机执行机器代码,用字节编码低级的操作,包括处理数据.管理存储器.读写存储设备上的数据,利用网络通信,编译器基于变成语言的原则, 目标机器的指令集合操作系统遵循的原则,经过一系列阶段产生机器代码,gcc c语言编辑器以汇编代码的形式输出,汇编代码是机器代码的文本表示,给出程序的每一条指令.然后gcc调用汇编器和链接器,根据汇编代码生成可执行的机器代码. 本章,近距离观察机器代码和汇编代码. 机器级的实现,被高级语言屏蔽了,用高级语言编写的程序可以在很多不同的机器上编译和执行,而汇编代码则是与特

第三章程序的机器级表示 学习报告

第三章 程序的机器级表示 3.1 历史观点 Intel处理器系列俗称x86,开始时是第一代单芯片.16位微处理器之一. 每个后继处理器的设计都是后向兼容的——较早版本上编译的代码可以在较新的处理器上运行. X86 寻址方式经历三代: 1  DOS时代的平坦模式,不区分用户空间和内核空间,很不安全 2  8086的分段模式 3  IA32的带保护模式的平坦模式 3.2 程序编码 gcc -01 -o p p1.c -01 表示使用第一级优化.优化的级别与编译时间和最终产生代码的形式都有关系,一般认

CSAPP:第三章程序的机器级表示2

CSAPP:程序的机器级表示2 关键点:算术.逻辑操作 算术逻辑操作1.加载有效地址2.一元二元操作3.移位操作 算术逻辑操作 ??如图列出了x86-64的一些整数和逻辑操作,大多数操作分成了指令类(只有leaq没有其他的变种,addb.addw.addl.addq分别是字节加法.字加法.双字加法和四字加法),这些操作通常分为四组:加载有效地址.一元操作.二元操作和移位操作. 1.加载有效地址 leaq S,D;D = &S??加载有效地址指令leag实际上是movq指令的变形,它的指令形式上是

六星经典CSAPP-笔记(3)程序的机器级表示

1.前言 IA32机器码以及汇编代码都与原始的C代码有很大不同,因为一些状态对于C程序员来说是隐藏的.例如包含下一条要执行代码的内存位置的程序指针(program counter or PC)以及8个寄存器.还要注意的一点是:汇编代码的ATT格式和Intel格式.ATT格式是GCC和objdump等工具的默认格式,在CSAPP中一律使用这种格式.而Intel格式则通常会在Intel的IA32架构文档以及微软的Windows技术文档中碰到.两者的主要区别有: Intel格式忽略指令中暗示操作数长度

C语言程序的机器级表示

过程调用的机器级表示 特别说明该表示是基于IA-32指令系统,x86 64指令系统不同于IA-32 机器级表示 可执行文件的存储器映像 调用过程 IA-32的寄存器使用约定 – 调用者保存寄存器:EAX.EDX.ECX 当过程P调用过程Q时,Q可以直接使用这三个寄存器,不用 将它们的值保存到栈中.如果P在从Q返回后还要用这三个寄 存器的话,P应在转到Q之前先保存,并在从Q返回后先恢复 它们的值再使用. – 被调用者保存寄存器:EBX.ESI.EDI Q必须先将它们的值保存到栈中再使用它们,并在返

程序的机器级表示

P104,p105:     X86,经历了一个长期的的不断发展的过程.开始时他是第一代单芯片和16位微处理器之一,由于当时集成电路技术水平十分有限,其中做了很多妥协.此后,他不断地成长,利用进步的技术满足更高性能和支持更高级的操作系统的需求. 8086(1978) 80286(1982) i386(1985) i486(1989) Pentium(1993) PentiumPro(1995) Pentium II(1997) Pentium III(1999) Pentium 4(2000)

程序的机器级表示 (2)

3.6.5 循环 据说大多数汇编器会根据do-while循环来产生代码, 所以其他循环可能会先转化为do-while形式再编译成机器代码, 所以我们首先介绍do-while循环... 1. do-while 循环 do-while的通用形式如图所示 : loop: body-statement t = test-expr; if(t) goto loop; 这里给出一个实际的例子 : 2. while循环 while循环有多种翻译方法, gcc使用了的是 先用if 进行检测第一次循环, 这样就将