首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试点eax %eax

测试点eax %eax
EN

Stack Overflow用户
提问于 2012-10-25 08:43:26
回答 4查看 244.5K关注 0票数 204

可能重复: x86 Assembly - ‘testl’ eax against eax?

我对汇编语言编程非常陌生,目前我正在尝试读取二进制文件生成的汇编语言。我跑过去了

代码语言:javascript
复制
 test   %eax,%eax

或者test %rdi, %rdi,等等,我很困惑这是做什么的。%eax, %eax中的值不是相同的吗?它在测试什么?我在某个地方读到它正在执行AND operation.....but,因为它们是相同的值,它不是只返回%eax吗?

以下只是我发现这种用法的一个实例:

代码语言:javascript
复制
   400e6e:       85 c0                   test   %eax,%eax
   400e70:       74 05                   je     400e77 <phase_1+0x23>

我认为如果比较的两个值是je,那么equal......well就会跳转,因为%eax本身很好,在什么情况下我们不会跳呢?

我一般都是编程初学者,所以如果有人能向我解释这一点,我会非常感激的。谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-25 08:53:58

CMP减去操作数并设置标志。也就是说,如果差为零(操作数相等),则设置零标志。

当AND操作的结果为零时,TEST设置零标志ZF。如果两个操作数相等,它们的位数和当两个操作数都为零时为零。当在结果中设置最重要的位时,TEST还设置符号标志SF,当set位数为偶数时设置奇偶标记PF

JE跳转,如果等于测试零标志,如果设置了标志,则跳转。JE是如果零的话JZ跳转的别名,所以反汇编程序不能根据操作码选择一个。之所以这样命名JE,是因为如果CMP的参数相等,则设置零标志。

所以,

代码语言:javascript
复制
TEST %eax, %eax
JE   400e77 <phase_1+0x23>

如果%eax为零,则跳。

票数 227
EN

Stack Overflow用户

发布于 2012-10-25 09:02:49

一些x86指令被设计成保留操作数(寄存器)的内容,只设置/未设置特定的内部CPU标志,比如零标志(ZF)。您可以将ZF视为驻留在CPU中的真/假布尔标志。

在这种特殊情况下,测试指令执行按位的逻辑,并根据逻辑的结果丢弃实际结果并设置/取消设置ZF;如果结果为零,则设置ZF = 1,否则设置ZF = 0。

像JE这样的条件跳转指令被设计用来查看ZF,用于跳/不跳,所以使用TEST和JE一起等效于根据特定寄存器的值执行条件跳转:

示例:

代码语言:javascript
复制
TEST EAX,EAX
JE some_address

CPU跳转到"some_address“当且仅当ZF = 1,换句话说,当且仅当和( EAX,== )=0,这反过来可以发生当且仅当==0。

等价的C代码是:

代码语言:javascript
复制
if(eax == 0)
{
    goto some_address
}
票数 64
EN

Stack Overflow用户

发布于 2012-10-25 08:53:39

这将检查EAX是否为零。指令test在参数之间按位执行AND,如果EAX包含0,则结果设置ZF或ZeroFlag。

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

https://stackoverflow.com/questions/13064809

复制
相关文章

相似问题

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