从 sub 指令中得到否定结果 x86_64

Get a negative result out of sub instruction x86_64

我一直坚持一个相当简单的指令,但在我试图真正理解它之前,汇编中的一切看起来都很简单哈哈。 我已经注意到这个 post 澄清了一些东西,但我仍然感到困惑:

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

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

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

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

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