历史观点
IA32,x86-64得32位前身。
程序编码
void multstore(long x, long y, long *dest)
{
long t = mult2(x, y);
*dest = t;
}
multstore:
pushq %rbx
movq %rdx, %rbx
call mult2
movq %rax, (%rbx)
popq %rbx
ret
53 48 89 d3 e8 00 00 00 00 48 89 03 5b c3
机器级代码
代码示例
操作数
源数据:常熟形式给出 \ 寄存器或内存中读出
结构:存放在寄存器或内存中
立即数
关于格式的注解
数据格式
字:16位
双字:32位
四字:64位
访问信息
x86-64CPU包含一组16个64位值得通用目的寄存器。
数据传送指令
压入和弹出栈数据指令
移位操作
算术操作
算术和逻辑操作
加载有效地址
一元和二元操作
移位操作
讨论
特殊的的算术操作
控制
条件码
访问条件码
跳转指令
跳转指令编码
用条件控制来实现条件分支
用条件传送来实现条件分支
循环
switch语句
过程
运行时栈
转移控制
数据传送
栈上的局部存储
寄存器中的局部存储空间
递归过程
数组分配和访问
基本原则
指针运算
嵌套的数组
定长数组
变成数组
异质的数据结构
结构
联合
数据对齐
在机器级程序中将控制与数据结合起来
理解指针
应用:使用GDB调试器
内存越界引用和缓冲区溢出
对抗缓冲区溢出攻击
支持变长栈帧
浮点代码
浮点传送和转化操作
过程中的浮点代码
浮点运算操作
定义和使用浮点常数
在浮点代码中使用位级操作
浮点比较操作
对浮点代码的观察结论