三目运算符和条件语句

#跳转指令
有符号

  • 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:    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值