cmp 字节 汇编_汇编条件判断整理(JCC,CMP/TEST的实现)

比较的实现

我们知道CMP是比较两个寄存器内容的指令,但这是如何实现的?

当执行到CMP指令的时候会读取这两个寄存器的内容,并加以减法运算,结果本身不保留,并按照结果设置符号位(属算术运算)。

CMP是一个经常使用的指令,大多用来测试数字的大小。一个常见的例子

MOV EAX, 10

MOV EAX, 10

CMP EAX, EBX ;相减求出结果,为0,将1存入ZF

JE SOME_WHERE ;检查ZF,为1就跳

JNE SOME_WHERE ;检查ZF,为0就跳

当执行到TEST指令的时候会读取这两个寄存器的内容,并加以按位与运算,结果不保留,并按照结果设置符号位(属逻辑运算)。

TEST是一个用来检测内容而不是运算内容的,经常用的一招是测试寄存器是否为0:

TEST EAX, EAX

JZ SOME_WHERE

某个参考资料说 TEST EAX,EBX 与 AND EAX,EBX 是一样的,窃以为不同,因为汇编的所有算术指令都是破坏性的,它会把结果存入 EAX,而TEST不会(就像C代码 a &= b;)。若要 AND 也不会破坏原值,只能先入栈存值,然后在出栈前转移结果,就像如下所示:

MOV EAX, ?? ;赋值

MOV EBX, ??

PUSH EAX ;入栈保存EAX

AND EAX, EBX ;运算

MOV EDX, EAX ;保存结果

POP EAX ;弹出恢复EAX

但是你要自己做一个CM

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值