首页 > 解决方案 > 从子指令 x86_64 中得到否定结果

问题描述

我一直坚持一个相当简单的指令,但是在我尝试真正理解它之前,汇编中的所有内容看起来都很简单哈哈。我已经注意到这篇文章澄清了一些东西,但我仍然感到困惑:Understanding intel SUB instructions

这是一个超级简单的情况:
两个字符串被发送到函数进行比较。我脱光衣服以保留必需品。

function:
    mov al, [rdi]   ; == 0
    sub al, [rsi]   ; == 32
    ret             ; returns 224 and not -32 like I would like

我猜我需要在子指令之后检查溢出标志,如果它打开,那么我的结果是否定的。或者也许是标志标志,更合乎逻辑(在这种情况下两者似乎都正确?)

从中,我需要在返回之前将 rax 减去 256 使其变为 -32 ......但这对我来说似乎有点奇怪,必须有更清洁的方法吗?

标签: x86-64nasmtwos-complement

解决方案


8 位值224-32在 x86 和 x86-64 上是相同的,因为它使用二进制补码来表示负数。减去 256 对你没有帮助。由函数的调用者决定将结果解释为有符号(-128127,在这种情况下是-32),还是无符号(0255,在这种情况下是224)。我假设你问这个是因为你调用这个函数的代码错误地解释了它。如果您不小心movzx在结果上使用而不是movsx扩展它,或者更糟糕的是,如果您使用ax,eaxrax没有先扩展它(在这种情况下,您最终可能会得到完整的垃圾,例如0x11223344556677e0),则可能会发生这种情况。


推荐阅读