【发布时间】:2013-10-07 03:56:02
【问题描述】:
我正在做家庭作业。我们得到一个预编译的二进制文件,我们必须使用gdb 来获取程序集转储、遍历数据结构、查看存储在内存中的值等,以便弄清楚二进制文件的作用。以下是来自函数调用的几行反汇编程序转储:
0x08048e14 <+21>: test %esi,%esi
0x08048e16 <+23>: jne 0x8048e4b <fun6+76>
0x08048e18 <+25>: jmp 0x8048e5d <fun6+94>
我假设test %esi,%esi 将始终返回“等于”的结果(或者,更确切地说,使用寄存器标志表示的等效语句,我相信它只是设置了ZF?),并且@987654325 @ 指令永远不会执行,而是程序将在行 <+25> 处执行指令。但是,在单步执行这些指令后,程序会跳转到行<+76>!为什么会这样?我很困惑。
如果它有助于解释答案,这里是 <+21> 行的 test 指令之后的寄存器标志(ZF 没有设置?)(我仍然不知道如何解释这些标志):
eflags 0x202 [ IF ]
【问题讨论】:
标签: c assembly gdb disassembly