第三章 程序的机器级表示
机器级代码
机器级编程的两种抽象
指令集结构IA
是机器级程序的格式和行为,定义了处理器状态、指令的格式,以及每条指令对状态的影响。
机器级程序使用的存储器地址是虚拟地址
看上去是一个非常大的字节数组,实际上是将多个硬件存储器和操作系统软件组合起来。
编码格式:
GCC -S -O1 XXXX.XX
-01 -o为编译参数
反汇编格式:odujump -d xxxx.xx
这来易于这是自下而上,利用二进制序列生成代码
二进制文件可以用od 命令查看,也可以用gdb的x命令查看。
有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看。od code.o > code.txt,od code.o | more
几个处理器:
程序计数器(CS:IP)
整数寄存器(AX,BX,CX,DX)
条件码寄存器(OF,SF,ZF,AF,PF,CF)
注意事项:
1 IA32指令长度从1到15个字节不等
2 Intel 为我们上学期学习的汇编内容,但这里为了更接近计算机使用的是att
3 区别在于intel为去掉指令后缀并且指令后前是执行地址后为操作数
数据大小
ISA32系统对应c操作:char 字节 1字节,
short 字 2字节,
int 双字 4字节
操作数:
指示出执行一个操作中要引用的源数据值,以及放置结果的目标位置。
三种类型
- 立即数
- 寄存器
- 存储器
数据传送
寻址方式
1 立即数
后面直接跟数据地址
2 寄存器寻址方式:
寄存器当中介
3 存储器寻址方式:
通过立即数和着寄存器的对应关系组合
mov指令
MOV DST,SRC
相应后缀
b 传送字节
w 传送字
z扩展0
注意事项:
Mov 1 等命令后面可以接不同寻址地方表达
不同寻找方式都可以当作地址输入
2 intel版本的mov后面第一个为地址存入 第二为传输信息
3 大的地址可以接收小数据,但小地址不能接受比其位数大的数据
4 不能两存储器之间传输
push&pop
都是堆栈操作关键在 后进先出
push
指针—2
pop
指针+2
注意事项:
1 栈顶为最小指针处,向上取,取值大小不同移动位置不同,只可以是字的倍数
2 类似于mov地址可以变动
移位命令
源操作数:移位量——立即数或CL
目的操作数:要移位的数值——寄存器或存储器
算术运算:
加减乘除四则
注意事项:
1 在进行乘除运算时结果的位数都会提高一半字节这用于保存的寄存器应该要有相对应的存储空间
2 在进行有截断的操作时,可以把数存到原来的地址处来节省空间
3 除法中的余数会保留在dx中
条件码状态控制
注意事项:
1 传输不影响标志位在有运算参与时会根据运算看标志位变化
2 运用范围可以是改变循环条件,通过set改变
跳转指令
JUMP指令
可以跳着已在c中goto类型方式
注意事项:
1 jump可以实现地址跳跃对于pc指令为下一跳指令
2 需要条件码以及dx中选择值作用控制循环变量
循环
就是将不同的循环模式改写成GOTO
堆栈
用来传递参数、存储返回信息等
栈帧
为单个过程分配的那部分栈称为栈帧,栈的一部分
转移
call调用子函数
ret 后返回值
leave 中断并后返回
注意事项:
1 调用函数的时候pc的位置会发生改变
2 在退出时可以用无返回的书函数