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减去操作数并设置标志.即,如果差值为零(操作数相等),则设置零标志.
TESTZF当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条件跳转相结合。
| 归档时间: |
|
| 查看次数: |
145418 次 |
| 最近记录: |