我正在试着理解一些汇编。
如下所示的汇编,我对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之间的观点?我认为这段代码的细节并不重要,我只是试图理解测试本身-值不是总是真的吗?
发布于 2008-09-29 01:23:44
它测试eax是否为0、大于或低于0。在这种情况下,如果eax为0,则进行跳转。
发布于 2008-09-29 01:24:50
test的含义是将参数与一起,并检查结果是否为零。所以这段代码测试EAX是否为零。如果为零,则je将跳转。
顺便说一句,这会生成比cmp eax, 0更小的指令,这就是编译器通常会这样做的原因。
发布于 2008-09-29 01:29:03
测试指令在操作数之间执行逻辑与操作,但不将结果写回寄存器。仅更新标志。
在您的示例测试eax中,如果eax为零,则eax将设置零标志,如果设置了最高位,则将设置sign标志,还将设置一些其他标志。
如果设置了零标志,则等于跳转(je)指令跳转。
您可以将代码转换为可读性更好的代码,如下所示:
cmp eax, 0
je somewhere它具有相同的功能,但需要多一些字节的代码空间。这就是为什么编译器发出测试而不是比较的原因。
https://stackoverflow.com/questions/147173
复制相似问题