- 1、本文档共21页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
程序的机器级表示
3 程序的机器级表示
2017年3月11 日 11:29
1. 计算机执行机器代码,用字节序列编码低级的操作,包括处理数据、管理存储
器、读写存储在设备上的数据,以及利用网络通信。
2. 通常情况下,现代的优化编译器产生的代码至少与一个熟练的汇编语言程序员手
工编写的代码一样有效。
3. 用高级语言编写的程序可以在很多不同的机器上编译和执行,而汇编代码则是与
特定机器密切相关的。
4. 学习机器代码的意义在于,以适当的命令行选项调用编译器,编译器就会产生一
个以汇编代码形式表示的输出文件,通过阅读这些代码,我们能够理解编译器的
优化能力,并分析代码中隐含的低效率。
分区 《深入理解计算机系统》笔记 的第 1 页
3.1 历史观点
2017年3月11 日 11:40
1. Linux使用平坦寻址(float addressing ),使程序员将整个存储空间看作一个大
的字节数组。
分区 《深入理解计算机系统》笔记 的第 2 页
3.2 程序编码
2017 3 11 11:40
年 月 日
1. 对于机器级编程来说,计算机系统中的两种抽象尤为重要:
a. 机器级程序的格式和行为 ,定义为指令集体系结构(Instruction set architecture, ISA ),它定义了处理器状
态、指令的格式,以及每条指令对状态的影响;
b. 机器级程序使用的存储器地址是虚拟地址 ,提供的存储器模型看上去是一个非常大的字节数组,存储器系
统的实际实现是将多个硬件存储器和操作系统软件组合起来。
2. 处理器状态:
a. 程序计数器(PC, %eip ),指示将要执行的下一条指令在存储器中的地址;
b. 整数寄存器,包含八个命名的位置,分别存储32位的值;
c. 条件码寄存器,保存着最近执行的算术或逻辑指令的状态信息;
d. 一组浮点寄存器,存放浮点数据;
3. 程序存储器(program memory ),包含程序的可执行代码,操作系统需要的一些信息,用来管理过程调用和返
回的运行时栈,以及用户分配的存储器块(如用malloc分配的)。程序存储器用虚拟地址来寻址,在任意给定时
刻,只认为有限的一部分虚拟地址是合法的。虽然IA32的32位地址可以寻址4GB的地址范围,但是通常一个程序
只会访问几兆字节。
4. 操作系统负责管理虚拟地址空间,将虚拟地址翻译成实际处理器存储器(processor memory )中的物理地址。
5. 汇编代码不区分有符号数或无符号数,不区分各种类型的指针,甚至不区分指针和整数。
6. 一条机器指令只执行一个非常基本的操作。
分区 《深入理解计算机系统》笔记 的第 3 页
3.3 数据格式
2017年3月11 日 16:02
1. 由于是从16位体系结构扩展成32位的,Intel用“字”(word )表示16位数据类型。
因此,32位数称为“双字”(double words ),称64位数为“四字”(quad
words )。
2. 大多数gcc生成的汇编代码指令都有一个字符后缀,表明操作数的大小:
a. movb :传送字节;
b. movw :传送字;
c. movl :传送双字。
分区 《深入理解计算机系统》笔记 的第 4 页
3.4 访问信息
2017 3 11 16:09
年 月 日
1. 一个IA32 CPU包含一组8个存储32位值的寄存器,如下图:
a. 在大多数情况下,前六个寄存器都可以看作是通用寄存器,对它们的使用没有限制。之所
/
以说是在大多数情况下,是因为有些指令以固定的寄存器作为原寄存器和 或目的寄存器;
b. 在处理过程中,对%eax、%ecx、%edx的保存和恢复惯例不同于%ebx、%edi和%esi ;
c. %esp、%ebp保存着指向程序栈中重要位置的指针,只有根据栈管理的标准惯例才能修改
这两个寄存器
文档评论(0)