为了账号安全,请及时绑定邮箱和手机立即绑定

`testl` eax对抗eax?

`testl` eax对抗eax?

`testl` eax对抗eax?我想了解一些装配。汇编如下,我对该testl行感兴趣:000319df  8b4508        movl   0x08(%ebp), %eax  000319e2  8b4004        movl   0x04(%eax), %eax  000319e5  85c0          testl  %eax, %eax  000319e7  7407          je     0x000319f0  我想了解的那点testl之间的%eax和%eax?我认为这段代码的具体内容并不重要,我只是试图用自己来理解测试 - 这种价值总是不正确吗?
查看完整描述

3 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

它测试eax是0,或更高,或更低。在这种情况下,如果eax为0 则跳转。


查看完整回答
反对 回复 2019-08-19
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

意思test是将参数和AND组合在一起,并将结果检查为零。因此,此代码测试EAX是否为零。je如果为零,将跳跃。

顺便说一句,这会生成一个比cmp eax, 0编译器通常这样做的原因更小的指令。


查看完整回答
反对 回复 2019-08-19
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

测试指令在操作数之间执行逻辑AND操作,但不将结果写回寄存器。只更新标志。

在您的示例中,测试eax,如果eax为零,则eax将设置零标志,如果最高位设置则设置符号标志以及其他一些标志。

如果设置了零标志,则跳转如果等于(je)指令跳转。

您可以将代码转换为更易读的代码,如下所示:

cmp eax, 0je  somewhere

它具有相同的功能,但需要一些字节更多的代码空间。这就是编译器发出测试而不是比较的原因。


查看完整回答
反对 回复 2019-08-19
  • 3 回答
  • 0 关注
  • 937 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信