1

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

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

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

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

eflags         0x202    [ IF ]
4

2 回答 2

7

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

并且jne实际上是“如果ZF不等于0就跳转”,所以这里它测试是否esi为零。

另请参阅“测试”指令如何工作?以及`test` 指令有什么作用?

于 2013-10-07T04:19:41.520 回答
1

我找到了答案:

testl b,a就像a&b没有设置目的地的计算一样。 ZF设置时a&b == 0

换句话说,我正在考虑的cmp指令显然与 不同test

于 2013-10-07T04:16:31.993 回答