第三章 程序的机器级表示
3.1 历史的观点
X86 寻址方式经历三代:
1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全
2 8086的分段模式
3 IA32的带保护模式的平坦模式
3.2 程序编码
指令集体系结构(ISA):计算机硬件与底层软件的接口,它是程序员为使一个二进制机器语言程序正常运行所需要了解的属性。
包含:寄存器组织,指令集,存储器的组织和寻址方式,中断机制,I/O系统结构,机器工作状态的定义及转换,数据类型及表示,保护机制。
指令格式:
操作数地址码 |
操作码 |
ISA的类型:
堆栈型,累加器型,寄存器—存储器型,寄存器—寄存器型。
汇编代码不区分有无符号的整数,不区分各种类型的指针
PC寄存器:程序计数器(在IA32中称为PC用%eip表示)指示将要执行的下一条指令在存储器中的地址。
是16位程序计数器,它不属于特殊功能寄存器。专门用于在CPU取指令期间寻址程序存储器。
gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编; 注意函数前两条和后两条汇编代码,所有函数都有,建立函数调用栈帧,应该理解、熟记。
注意: 64位机器上想要得到32代码:gcc -m32 -S xxx.c6
MAC OS中没有objdump, 有个基本等价的命令otool
Ubuntu中 gcc -S code.c (不带-O1) 产生的代码更接近教材中代码(删除"."开头的语句)
3.3数据格式
数据传输指令有三个变种:movb,movw,moul.
3.4访问信息
操作数:立即数,寄存器,存储器。
有效地址的计算方式 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s
栈:“先进后出”PUSH入栈,pop出栈。
3.5算术和逻辑操作
Leal:加载有效地址,注意源操作术是第一个,目的操作数为第二个。
其余指令上一章已经练习过了。
3.6控制
条件码:
跳转指令jp
3.7过程
寄存器%ebp为帧指针,%esp为栈指针。
call和leave,ret支持过程调用返回。
遇到的问题:
关于目的操作数与源操作数教材上的顺序与上学期学的IBM-PC汇编语言有所不同。
参考资料:
百度文库。
IBM-PC汇编语言程序设计。