gpt4 book ai didi

assembly - x86 sbb 与第一个和第二个操作数具有相同的寄存器

转载 作者:行者123 更新时间:2023-12-02 22:08:18 26 4
gpt4 key购买 nike

我正在分析 x86 的序列说明,并与以下代码混淆:

135328495: sbb edx, edx
135328497: neg edx
135328499: test edx, edx
135328503: jz 0x810f31c

我明白 sbb等于 des = des - (src + CF) ,换句话说,第一条指令不知何故放入 -CF进入 edx .那么它 negtive -CF进入 CF , 和 test是否 CF等于零??

但请注意 jz检查标志 ZF ,不是 CF !那么基本上上面的代码序列试图做什么?这是合法的 x86指令序列,由 g++ 产生版本 4.6.3 .
C++代码实际上来自 botan项目。您可以在 here 找到整个汇编代码(Botan RSA 解密示例)。 .反汇编代码中有相当多的这样的指令序列。

最佳答案

sbb edx, edx


你对这条指令的分析是正确的。 SBB意思是“借用减法”。它以考虑进位标志 ( CF ) 的方式从目标中减去源。

因此,它相当于 dst = dst - (src + CF) ,所以这是 edx = edx - (edx + CF) ,或简单地 edx = -CF .

不要因为源操作数和目标操作数都是 edx 而愚弄您。这里! SBB same, same是编译器生成的代码中非常常见的用于隔离进位标志 ( CF ) 的习惯用法,尤其是当它们尝试生成无分支代码时。有其他方法可以做到这一点,即 SETC指令,这在大多数 x86 架构上可能更快(请参阅评论以获得更彻底的剖析),但不是很大。来自不同供应商(甚至可能是不同版本)的编译器倾向于偏爱其中一个,并在您不进行特定于体系结构的调整时在任何地方使用它。

neg edx


同样,您对本指令的分析是正确的。这是一个非常简单的。 NEG对其操作数执行补码求反。因此,这只是 edx = -edx .

在这种情况下,我们知道 edx原载 -CF ,这意味着它的初始值是 0-1 (因为 CF 总是 0 或 1,开或关)。否定它意味着 edx现在包含 01 .

也就是说,如果 CF原定, edx现在将包含 1 ;否则,它将包含 0 .这实际上是完成了上面讨论的习语;您需要 NEG完全隔离 CF 的值.

test edx, edx

TEST指令与 AND 相同指令,除了它不影响目标操作数——它只设置标志。

但这是另一个特例。 TEST same, samea standard idiom in optimized code有效地确定寄存器中的值是否为 0。你可以写 CMP edx, 0 ,这是人类程序员天真地做的事情,但是 test是比较快的。 (为什么这样做?因为按位与的真值表。唯一的情况是 value & value == 0value 为 0。)

所以这具有设置标志的效果。具体来说,它设置零标志( ZF )如果 edx为 0,如果 edx 清除它非零。

因此,如果 CF原定, ZF现在就清楚了;否则,它将被设置。也许更简单的方式是这三个指令集 ZFCF 的原始值相反.

以下是两种可能的数据流:
  • CF == 0 → edx = 0 → edx = 0ZF = 1
  • CF == 1 → edx = -1 → edx = 1ZF = 0

  • jz 0x810f31c


    最后,这是基于 ZF的值的条件跳转.如 ZF设置后,跳转到 0x810f31c ;否则,它将失败到下一条指令。

    然后,将所有内容放在一起,此代码通过涉及零标志 ( CF ) 的间接路由测试进位标志 ( ZF ) 的补码。如果进位标志最初被清除,则它分支,如果进位标志最初被设置,则失败。

    这就是它的工作原理。也就是说,我无法解释为什么编译器选择以这种方式生成代码。 它在许多层面上似乎都不是最优的。最明显的是,编译器可以简单地发出 JNC指令(如果不进位则跳转)。尽管 Peter Cordes 和我在评论中进行了各种其他观察和推测,但我认为将所有这些纳入答案是没有意义的,除非可以提供有关此代码来源的更多信息。

    关于assembly - x86 sbb 与第一个和第二个操作数具有相同的寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41031912/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com