指令指针
--------------------------------------------------------------------------------------------
无条件分支:
跳转
调用
中断
-----------------------
1.跳转指令
jmp == goto
短跳转
近跳转
远跳转
2.调用指令
call #保存eip的值到堆栈
ret #恢复原来eip的值到eip寄存器
3.中断指令
int
iret
软中断 0x80
硬中断
--------------------------------------------------------------------------------------------
条件分支:
条件跳转指令
jxx address
短跳转
近跳转
----------------------
1.使用比较指令
cmp operand1,operand2 #operand2 - operand1
2.使用标志位
使用零标志
使用溢出标志
使用奇偶校验标志
使用符号标志
使用进位标志
修改进位标志的指令
clc #清空 -->0
cmc #求反
stc #设置 -->1
-----------------------
--------------------------------------------------------------------------------------------
循环
loop #循环直到ecx=0
loope/loopz #循环直到ecx=0,或者ZF=0
loopne/loopnz #循环直到ecx=0,或者ZF=1
只能短跳转(即8位偏移量)
使用ecx计数
执行loop指令时,先把ecx减1,然后判断是否为0
jcxz 检查ecx是否为0
--------------------------------------------------------------------------------------------
salx #左移指令
leax #地址传送指令
--------------------------------------------------------------------------------------------
分支预测:
处理器优先采用向后分支(即执行已经执行过的指令),
如果无向后分支,则优先采用紧挨着跳转指令的指令(即非跳转目的地后的指令)
(对于C语言的if-else语句,优先采用紧挨着if的指令,而非else后的指令)
分支目标缓冲区:跟踪处理器执行的每一个分支指令,然后以此数据来预测分支
--------------------------------------------------------------------------------------------
优化技巧:
1.消除分支
使用cmov代替跳转指令
2.优先在可预测分支编写代码
比如循环内的代码,紧挨着跳转指令的代码
3.展开循环