首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘`testl`’eax与eax?

‘`testl`’eax与eax?
EN

Stack Overflow用户
提问于 2008-09-29 01:22:57
回答 8查看 86.6K关注 0票数 123

我正在试着理解一些汇编。

如下所示的汇编,我对testl行很感兴趣:

代码语言:javascript
复制
000319df  8b4508        movl   0x08(%ebp), %eax  
000319e2  8b4004        movl   0x04(%eax), %eax  
000319e5  85c0          testl  %eax, %eax  
000319e7  7407          je     0x000319f0  

我正在尝试理解testl%eax%eax之间的观点?我认为这段代码的细节并不重要,我只是试图理解测试本身-值不是总是真的吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-09-29 01:23:44

它测试eax是否为0、大于或低于0。在这种情况下,如果eax为0,则进行跳转。

票数 95
EN

Stack Overflow用户

发布于 2008-09-29 01:24:50

test的含义是将参数与一起,并检查结果是否为零。所以这段代码测试EAX是否为零。如果为零,则je将跳转。

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

票数 95
EN

Stack Overflow用户

发布于 2008-09-29 01:29:03

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

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

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

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

代码语言:javascript
复制
cmp eax, 0
je  somewhere

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

票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/147173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档