汇编需要考虑的四个要素
- 寄存器与寄存器堆
- 条件码
- 存储器
- 指令寄存器
条件码 :上一条指令运行结果反应在条件码中
- CF carry clag 进位
- 用于检测无符号整数运算溢出
- ZF zero flag 等于零
- SF sign flag 符号位
- OF overflow flag 溢出位
- 补码运算的溢出(带符号整数运算)
算术和逻辑操作指令都会修改条件码的值,但是leal指令不会修改条件码的值。
条件码寄存器不能直接读取,有三种方法:
set
jump:根据条件码进行跳转
cmov:条件传送指令,根据条件码决定是否进行mov操作
寻址模式
间接寻址:movl (%ecx),%eax
基址+偏移量寻址: movl 8(%ebp),%edx
变址寻址:D(Rb,Ri,S) mem[Rb + S*Ri + D]
D:常量
Rb;基址寄存器
Ri:索引寄存器 %esp不作为索引寄存器,一般%ebp也不用
S;比例因子1,2,4,or 8
0x8(%edx,%ecx,4)
循环
-
任何循环转换成goto
-
For – > While —>Do While ---->if Goto
for (Init : Test : Update) body || || Init; while (Test){ Body Update; } || || Init; if (!Test) goto done; do{ Body Update; }While (Test) done: || || Init; if (!Test) goto done; loop: Body Update; if (Test) goto loop; done;
Switch语句
1. 跳转表 Jump Table
1. jmp *.L62(,%edx,4) *代表jmp到返回地址上去 %edx表示判断的数值,4表示32下地址的长度 L62表示跳转表的地址
2.二叉树 if - else 当判断过于稀疏 如 1 7777 999
微体系结构
处理器流水线 5级流水
IF -- RD ---- ALU----MEM ---- WB
流水线的引出的--条件引出的性能损失 ----->解决方案,使用条件转移指令代理条件跳转---->引出问题,是否会改变全局变量,计算量是否太大
条件跳转暂时解决方案
- Branch Prediction技术,记录相关条件跳转次数,根据历史信息来预测你的行为
函数返回值32位存在eax中 64位在rax中
GCC使用–>产生的是AT&T的汇编格式
gcc -O2 -S code.c -m32
汇编相关trick
注:立即数,在汇编语言中有三种数,内存,寄存器,立即数,立即数就是常量,可以直接使用