GDB/GNU程序集:测试%esi,%esi返回不相等?

jay*_*ren 1 c assembly gdb disassembly

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

0x08048e14 <+21>:   test   %esi,%esi
0x08048e16 <+23>:   jne    0x8048e4b <fun6+76>
0x08048e18 <+25>:   jmp    0x8048e5d <fun6+94>
Run Code Online (Sandbox Code Playgroud)

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

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

eflags         0x202    [ IF ]
Run Code Online (Sandbox Code Playgroud)

sta*_*ify 7

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

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

另请参阅`test`指令如何工作?什么是'test`指令呢?