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

时间:2013-10-07 03:56:02

标签: c assembly gdb disassembly

我正在做家庭作业。我们给出了一个预编译的二进制文件,我们必须使用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>!为什么会这样?我很困惑。

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

eflags         0x202    [ IF ]

2 个答案:

答案 0 :(得分:6)

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

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

另见How does the `test` instruction work?What does the `test` instruction do?

答案 1 :(得分:1)

我找到了答案:

  

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

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