pau*_*ago 122 x86 assembly att
我对汇编语言编程非常陌生,我目前正在尝试阅读从二进制文件生成的汇编语言.我跑过去了
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
减去操作数并设置标志.即,如果差值为零(操作数相等),则设置零标志.
TEST
ZF
当AND运算的结果为零时,设置零标志.如果两个操作数相等,则当它们都为零时,它们的按位AND为零.当设置的最高位被设置时TEST
,还设置符号标志,SF
当PF
设置位数为偶数时,设置奇偶校验标志.
JE
[Jump if Equals]测试零标志,如果设置了标志则跳转.JE
是JZ
[Jump if Zero] 的别名,因此反汇编程序无法根据操作码选择一个.JE
命名是这样的,因为如果参数to CMP
相等则设置零标志.
所以,
TEST %eax, %eax
JE 400e77 <phase_1+0x23>
Run Code Online (Sandbox Code Playgroud)
如果%eax
为零则跳跃.
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.
test
是非破坏性的and
,它不返回操作结果,但会相应地设置标志寄存器。要了解它真正测试的内容,您需要检查以下说明。out 通常用于检查寄存器是否为 0,可能与jz
条件跳转相结合。