#跳转指令
有符号
- Great:大于
- Less :小于
- Equ : 等于
无符号
- Above:大于
- Blow :小于
- Equ : 等于
三目运算
定式
低版本优化
- 优化条件:三目运算操作数均为常量
10!=5?5:7
;变量 != A ? B : C 且 B < C
sub reg,A ;如果A为0 则这一步省略
neg reg ;对变量求补(二进制取反+1),正变负,负变正
sbb reg,reg ;当初始reg为非0则值为-1,否则为0
and reg,C-B ;如果为真则 reg = B-C
add reg,C
;变量 >= A ? B : C 且 B < C
cmp reg, A
setl al ;小于则al为 1
dec reg ;判断为真 reg = 0 ,否则reg = -1
and reg,C-B ;如果为真则 reg = 0 否则reg = B-C
add reg,C ;如果为真则为C 否则 reg = C + B - C = B
高版本优化
;条件传送指令cmovXX
cmovx source, destination
其中 x 是一个或者连个字母的代码,表示将触发传送操作的条件。
条件取决于 EFLAGS 寄存器的当前值
;变量 == A ? B : C 且 B > C
mov reg1, B
test reg, A ;判断变量与A是否相等
mov reg, C
cmovz reg, reg1 ;条件满足则传送(赋值)一次 reg = B=reg1 否则 reg = C
;案例
printf("%d\n", edi == 0 ? 67 : -88);
mov ecx, 67
test edi, edi ;这里直接影响ZF标志位
mov eax, -88
cmovz eax, ecx ;若果相等 则eax = 67 否则为-88
push eax
push offset unk_4020F8
call printf
条件语句
单分支结构
- 定式
jxx IF_END:
.
. ;中间为条件体
. ;注意语句上面无跳转
IF_END
双分支结构
- 减少分支: 被优化成单分支结构
;第一种 被优化成单分支结构 减少分支
jxx IF_END:
.
. ;中间为条件体
. ;注意语句上面无跳转
IF_END
;案例
if(argc == nNumber)
{
printf("%d",nNumber / 8);
}
else
{
printf("%d",nNumber / 5);
}
return nNumber;
;编译器最后优化成
if(argc == nNumber)
{
printf("%d",nNumber / 8);
return nNumber;
}
printf("%d",nNumber / 5);
return nNumber;
- 多分支结构
定式
jxx ELSE_BEGIN:
...
IF_END:
JMP ELSE_END:
ELSE_BEGIN ;注意上方为向下跳转至结尾
...
ELSE_END: