C语言 GDB / GNU 汇编:测试 %esi,%esi 返回不相等



我正在做家庭作业。我们得到了一个预编译的二进制文件,我们必须使用 gdb 来获取程序集转储、遍历数据结构、查看存储在内存中的值等,以便弄清楚二进制文件的作用。以下是函数调用中的几行反汇编器转储:

0x08048e14 <+21>:   test   %esi,%esi
0x08048e16 <+23>:   jne    0x8048e4b <fun6+76>
0x08048e18 <+25>:   jmp    0x8048e5d <fun6+94>

我假设test %esi,%esi总是返回"等于"的结果(或者更确切地说,使用寄存器标志表达的等效语句,我相信只有ZF设置了?),并且jne指令永远不会执行,相反,程序将在第 <+25> 行执行指令。但是,在逐步执行这些说明后,程序将跳转到第 <+76> 行!为什么会这样?我很困惑。

如果它有助于解释答案,这里是第 <+21>test指令之后的寄存器标志(ZF没有设置?(我仍然不知道如何准确解释标志):

eflags         0x202    [ IF ]

test指令执行按位AND,但不存储结果;它只设置标志。

jne实际上是"如果ZF不等于 0 则跳跃",所以这里测试esi是否为零。

另请参阅"测试"指令

如何工作?和"测试"指令有什么作用?

我想

我已经找到了答案:

testl b,a就像在不设置目的地的情况下计算a&bZF设置时a&b == 0.

换句话说,我在想cmp指令,这显然与test不同。

最新更新