我对汇编语言编程非常陌生,目前我正在尝试读取二进制文件生成的汇编语言。我跑过去了
test %eax,%eax或者test %rdi, %rdi,等等,我很困惑这是做什么的。%eax, %eax中的值不是相同的吗?它在测试什么?我在某个地方读到它正在执行AND operation.....but,因为它们是相同的值,它不是只返回%eax吗?
以下只是我发现这种用法的一个实例:
400e6e: 85 c0 test %eax,%eax
400e70: 74 05 je 400e77 <phase_1+0x23>我认为如果比较的两个值是je,那么equal......well就会跳转,因为%eax本身很好,在什么情况下我们不会跳呢?
我一般都是编程初学者,所以如果有人能向我解释这一点,我会非常感激的。谢谢!
发布于 2012-10-25 08:53:58
CMP减去操作数并设置标志。也就是说,如果差为零(操作数相等),则设置零标志。
当AND操作的结果为零时,TEST设置零标志ZF。如果两个操作数相等,它们的位数和当两个操作数都为零时为零。当在结果中设置最重要的位时,TEST还设置符号标志SF,当set位数为偶数时设置奇偶标记PF。
JE跳转,如果等于测试零标志,如果设置了标志,则跳转。JE是如果零的话JZ跳转的别名,所以反汇编程序不能根据操作码选择一个。之所以这样命名JE,是因为如果CMP的参数相等,则设置零标志。
所以,
TEST %eax, %eax
JE 400e77 <phase_1+0x23>如果%eax为零,则跳。
发布于 2012-10-25 09:02:49
一些x86指令被设计成保留操作数(寄存器)的内容,只设置/未设置特定的内部CPU标志,比如零标志(ZF)。您可以将ZF视为驻留在CPU中的真/假布尔标志。
在这种特殊情况下,测试指令执行按位的逻辑,并根据逻辑的结果丢弃实际结果并设置/取消设置ZF;如果结果为零,则设置ZF = 1,否则设置ZF = 0。
像JE这样的条件跳转指令被设计用来查看ZF,用于跳/不跳,所以使用TEST和JE一起等效于根据特定寄存器的值执行条件跳转:
示例:
TEST EAX,EAX
JE some_addressCPU跳转到"some_address“当且仅当ZF = 1,换句话说,当且仅当和( EAX,== )=0,这反过来可以发生当且仅当==0。
等价的C代码是:
if(eax == 0)
{
goto some_address
}发布于 2012-10-25 08:53:39
这将检查EAX是否为零。指令test在参数之间按位执行AND,如果EAX包含0,则结果设置ZF或ZeroFlag。
https://stackoverflow.com/questions/13064809
复制相似问题