`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贡献1943条经验 获得超7个赞
意思test
是将参数和AND组合在一起,并将结果检查为零。因此,此代码测试EAX是否为零。je
如果为零,将跳跃。
顺便说一句,这会生成一个比cmp eax, 0
编译器通常这样做的原因更小的指令。
蝴蝶不菲
TA贡献1810条经验 获得超4个赞
测试指令在操作数之间执行逻辑AND操作,但不将结果写回寄存器。只更新标志。
在您的示例中,测试eax,如果eax为零,则eax将设置零标志,如果最高位设置则设置符号标志以及其他一些标志。
如果设置了零标志,则跳转如果等于(je)指令跳转。
您可以将代码转换为更易读的代码,如下所示:
cmp eax, 0je somewhere
它具有相同的功能,但需要一些字节更多的代码空间。这就是编译器发出测试而不是比较的原因。
添加回答
举报
0/150
提交
取消