【问题标题】:GDB / GNU assembly: test %esi,%esi returns not equal?GDB / GNU 程序集:测试 %esi,%esi 返回不相等?
【发布时间】: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 @ 指令永远不会执行,而是程序将在行 &lt;+25&gt; 处执行指令。但是,在单步执行这些指令后,程序会跳转到行&lt;+76&gt;!为什么会这样?我很困惑。

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

eflags         0x202    [ IF ]

【问题讨论】:

    标签: c assembly gdb disassembly


    【解决方案1】:

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

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

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

    【讨论】:

    • SO 会自动为其自己的链接插入问题标题。
    • @rici 非常感谢您指出这一点 :) 但是在我发布此答案后,它显示“在此处输入链接描述”XD,这让我很困惑..
    • starrify:有一些奇怪的更新问题。如果您看起来有以前的版本,或者您缺少刚刚输入的评论等,请重新加载页面,您通常会获得最新版本。
    【解决方案2】:

    认为我找到了答案:

    testl b,a 就像计算 a&amp;b 而不设置目标。 ZF 设置为a&amp;b == 0

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

    【讨论】:

    • 哦,是的,这是真的。 :)
    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    相关资源
    最近更新 更多