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

计算机执行机器代码,用字节编码低级的操作,包括处理数据、管理存储器、读写存储设备上的数据,利用网络通信,编译器基于变成语言的原则, 目标机器的指令集合操作系统遵循的原则,经过一系列阶段产生机器代码,gcc c语言编辑器以汇编代码的形式输出,汇编代码是机器代码的文本表示,给出程序的每一条指令。然后gcc调用汇编器和链接器,根据汇编代码生成可执行的机器代码。

本章,近距离观察机器代码和汇编代码。

机器级的实现,被高级语言屏蔽了,用高级语言编写的程序可以在很多不同的机器上编译和执行,而汇编代码则是与特定机器密切相关的。

3.1 历史观点

3.2 程序编码

3.2.1 机器级代码

计算机系统使用了多种不同形式的抽象,利用抽象模型隐藏实现的细节,对于机器级编码来说,两种抽象非常重要,

1)机器级程序的格式和行为,定义为指令集体系结构(ISA)

2)机器级程序使用的存储器地址是虚拟地址,提供的存储器模型看上去是非常大的字节数组,存储器系统的实际实现,是将多个硬件存储器和操作系统软件组合起来。

IA32机器代码和原始C代码差别很大,一些通常对C语言隐藏的处理器状态是可见的:

1)程序计数器 pc 用%eip表示,指示将要执行的下一条指令在存储器中的地址

2)整数寄存器文件 8个命名的位置,

3)条件码寄存器:最近执行的算术或者逻辑指令的状态信息,用来实现控制或数据流中的条件变化,比如用来实现if 和while语句

4)一组浮点寄存器存放浮点数据

机器代码吧存储器看成一个很大的按照字节寻址的数组。

5)程序存储器 包含程序的可执行机器代码,操作系统需要的一些信息,过程调用和返回的栈,用户分配的存储器块。

程序存储器用虚拟地址来寻址,操作系统负责管理虚拟地址空间,把虚拟地址翻译成实际处理器存储器中的物理地址。

3.2.2 代码示例

3.2.3 关于格式的注解

3.3 数据格式

3.4 访问信息

3.5 算术和逻辑操作

3.6 控制

3.7 过程

一个过程调用包括吧数据(以过程参数和返回值的形式)和控制,从代码的一部分传递到另一部分。另外,他还必须在进入时为过程的局部变量分配空间,并在退出时释放这些空间,数据传递 局部变量的分配 释放,通过操纵程序栈来实现。

IA32程序用程序栈来支持过程调用,机器用栈传递过程参数、存储返回信息、保存寄存器用于以后恢复,以及本地存储。为单个过程分配的哪部分栈称为栈帧(satck frame)。寄存器%ebp为帧指针,寄存器%esp为栈指针。

许多编译后的函数并不需要栈帧,如果所有的局部变量都能保存在寄存器中,而且这个函数也不会调用其他函数,那么需要栈额唯一原因就是用来保存返回地址。

使函数需要栈的原因如下:

1)局部变量太多,不能都放在寄存器中

2)有些局部变量是数组或者结构

3)函数用取地址操作符(&)来计算以各局部变量的地址

4)函数必须必须把站上的某些参数传递到另一个函数

5)在修改一个被调用者保存寄存器之前,函数需要保存他的状态

3.8 数组分配和访问

3.9 异质的数据结构

3.10 指针

3.11GDB调试器

3.12 存储器的越界引用和缓冲区溢出

3.13 扩展IA32到64位 3.14 浮点程序的机器级表示

3.14 小结

程序变量是在运行时栈中,还是在某个动态分配的数据结构中,还是在某个全局存储位置中。理解程序如何映射到机器上会理解这些存储器的差别。

时间: 2024-08-04 10:19:10

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

深入理解计算机系统第二版习题解答CSAPP 2.10

对于任一位向量a,有a ^ a = 0.考虑下面的程序: 1 void inplace_swap(int *x, int *y) 2 { 3 *y = *x ^ *y; 4 *x = *x ^ *y; 5 *y = *x ^ *y; 6 } 假设x和y指向的位置分别是a和b.完成下表: 步骤 *x *y 初始 a b 第一步 a a^b 第二步 a^(a^b) a^b 第三步 a^(a^b) a^(a^b)^(a^b) 由于异或运算满足交换率和结合率,且a ^ 0 = 0, a ^   = ~a

深入理解计算机系统第二版习题解答CSAPP 2.13

从20世纪70年代末到80年代末,Digital Equipment的VAX计算机是一种非常流行的机型.它没有布尔运算AND和OR指令,只有bis(位设置)和bic(位清除)这两种指令.两种指令的输入都是一个数据字x和一个掩码字m.它们生成一个结果z,z是由根据掩码m的位来修改x的位得到的.使用bis指令,这种修改就是在m为1的每个位置上,将z对应的位设置为1.使用bic指令,这种修改就是在m为1的每个位置,将z对应的位设置为0. 只使用这两个函数实现C语言的按位|和^运算. 1 int bis

深入理解计算机系统第二版习题解答CSAPP 2.6

使用打印字节的方式可以知道十进制数12345的十六进制为0x00003039,十进制浮点数12345.0的十六进制为0x4640E400. 转换为二进制为 1 /* 2 0 0 0 0 3 0 3 9 3 00000000000000000011000000111001 4 ************* 5 4 6 4 0 E 4 0 0 6 01000110010000001110010000000000 7 8 */ 移动后有13位匹配. 已知十进制数3510593的十六进制为0x003591

深入理解计算机系统第二版习题解答CSAPP 2.12

对于下面的值,写出变量x的C语言表达式.代码应该对任何字长w≥8都能工作.我们给出当x=0x87654321以及w=32时表达式的结果,仅供参考. A.x的最低有效字节,其他位均为0.[0x00000021]. B.除了x的最低有效字节外,其他位都取补,最低有效字节保持不变.[0x789ABC21]. C.x的最低有效字节设置成全1,其他字节都保持不变.[0x876543FF]. 解答: A. x & 0xFF B. ~(x ^ 0xFF)或者(~x) ^ 0xFF C. x | 0xFF

深入理解计算机系统第二版习题解答CSAPP 2.18

将32位补码表示的数转换为10进制数. 32位补码 十进制 0x1b8 440 0x14 20 0xFFFFFE58 -424 0xFFFFFE74 -396 0x44 68 0xFFFFFEC8 -312 0x10 16 0xC 12 0xFFFFFEEC -276 0x20 32

深入理解计算机系统第二版习题解答CSAPP 2.19

在2.17的基础上完成下表: x 十六进制 T2U(x) -8 0x8 8 -3 0xD 13 -2 0xE 14 -1 0xF 15 0 0x0 0 5 0x5 5

深入理解计算机系统第二版习题解答CSAPP 2.17

假设w=4,我们能给每个可能的十六进制数字赋予一个数值,假设用一个无符号或者补码表示.完成下表: x 无符号(B2U(x)) 补码(B2T(x)) 十六进制 二进制 0xE 1110 14 -2 0x0 0000 0 0 0x5 0101 5 5 0x8 1000 8 -8 0xD 1101 13 -3 0xF 1111 15 -1

深入理解计算机系统第二版习题解答CSAPP 2.16

填写下表,说明不同移位运算对单字节数的影响. x x<<3 x>>2(逻辑) x>>2(算术) 十六进制 二进制 二进制 十六进制 二进制 十六进制 二进制 十六进制 0xC3 1100 0011 0001 1000 0x18 0011 0000 0x30 1111 0000 0xF0 0x75 0111 0101 1010 1000 0xA8 0001 1101 0x1D 0001 1101 0x1D 0x87 1000 0111 0011 1000 0x38 001

深入理解计算机系统第二版习题解答CSAPP 2.11

在2.10中的inplace_swap函数的基础上,你决定写一段代码,实现将一个数组中的元素两端依次对调,你写出下面这个函数: 1 void reverse_array(int a[], int cnt) 2 { 3 int first, last; 4 for(first = 0, last = cnt - 1; 5 first <= last; 6 first ++, last --) 7 { 8 inplace_swap(&a[first], &a[last]); 9 } 10

深入理解计算机系统第二版习题解答CSAPP 2.1

A.将0x39A7F8转换为二进制. 0011 1001  1010 0111  1111 1000 B.将二进制1100 1001 0111 1011转换为十六进制. 0xC97B C.将0xD5E4C转换为二进制. 0000 1101  0101 1110  0100 1100 D.将二进制10 0110 1110 0111 1011 0101转换为十六进制. 0x26D7B5