测试点%eax%eax

pau*_*ago 122 x86 assembly att

可能重复:
x86汇编 - 针对eax的'testl'eax?

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

 test   %eax,%eax
Run Code Online (Sandbox Code Playgroud)

或者test %rdi, %rdi等等.我很困惑这是做什么的.这些价值不%eax, %eax一样吗?什么是测试?我在某处读到它正在进行AND操作.....但由于它们是相同的值,它不会只返回%eax吗?

以下是我发现此用法的一个实例:

   400e6e:       85 c0                   test   %eax,%eax
   400e70:       74 05                   je     400e77 <phase_1+0x23>
Run Code Online (Sandbox Code Playgroud)

je如果被比较的两个值相等,我认为跳跃......好吧,因为 %eax很好,本身,在什么情况下我们不会跳?

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

Joh*_*rak 139

CMP减去操作数并设置标志.即,如果差值为零(操作数相等),则设置零标志.

TESTZF当AND运算的结果为零时,设置零标志.如果两个操作数相等,则当它们都为零时,它们的按位AND为零.当设置的最高位被设置时TEST,还设置符号标志,SFPF设置位数为偶数时,设置奇偶校验标志.

JE[Jump if Equals]测试零标志,如果设置了标志则跳转.JEJZ[Jump if Zero] 的别名,因此反汇编程序无法根据操作码选择一个.JE命名是这样的,因为如果参数to CMP相等则设置零标志.

所以,

TEST %eax, %eax
JE   400e77 <phase_1+0x23>
Run Code Online (Sandbox Code Playgroud)

如果%eax为零则跳跃.

  • 即?x86指令列表[在维基百科上](http://en.wikipedia.org/wiki/X86_instruction_listings),它也链接了[英特尔的规范](http://www.intel.com/content/www/ us/en/processors/architecturalures-software-developer-manuals.html)以及[在回程机器上的另一个(相当可读)参考](http://web.archive.org/web/20100407092131/http://home .comcast.net /〜fbui/intel.html).Wikibooks上也提供了[教程](http://en.wikibooks.org/wiki/X86_Assembly). (9认同)
  • 我在哪里可以找到这样的信息? (4认同)
  • 如果`%eax`为零,则跳转,这就是我想要的. (2认同)

Gia*_*ini 48

某些x86指令旨在保留操作数(寄存器)的内容,只是设置/取消设置特定的内部CPU标志,如零标志(ZF).您可以将ZF视为驻留在CPU内部的真/假布尔标志.

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

像JE这样的条件跳转指令用于查看ZF的跳转/不跳跃,因此一起使用TEST和JE相当于根据特定寄存器的值执行条件跳转:

示例:

TEST EAX,EAX
JE some_address

当且仅当ZF = 1时,CPU将跳转到"some_address",换句话说,当且仅当AND(EAX,EAX)= 0时,当且仅当EAX == 0时

,等效的C代码是:

if(eax == 0)
{
    goto some_address
}
Run Code Online (Sandbox Code Playgroud)


ppe*_*rka 12

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

  • 这是执行此操作的标准方法.人们也可以做cmp%eax,0(立即)用于"初学者的清晰度",但这将编码为更长的指令(又名效率更低). (3认同)

Jen*_*ger 5

test是非破坏性的and,它不返回操作结果,但会相应地设置标志寄存器。要了解它真正测试的内容,您需要检查以下说明。out 通常用于检查寄存器是否为 0,可能与jz条件跳转相结合。