从子指令x86_64中获得否定结果

问题描述 投票:0回答:1

我一直坚持一个相当简单的指令,但是直到我试图真正理解它之前,汇编中的所有内容似乎都很简单。我已经关注了该帖子,该帖子澄清了一些内容,但我仍然感到困惑:Understanding intel SUB instruction

这里是一个非常简单的情况:将两个字符串发送给函数进行比较。我脱下来保留必需品。

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

我猜我需要在子指令后立即检查溢出标志,否则它的结果是否定的。或者也许是标志标志,更合乎逻辑(在这种情况下两者看起来都正确吗?)

从那以后,我需要在返回值之前减去256以使rax达到-32,但是对我来说似乎有点不可思议,有一种更简洁的方法吗?

x86-64 nasm twos-complement
1个回答
0
投票

8位值224-32在x86和x86-64上相同,因为它使用two's complement表示负数。减去256将无济于事。由函数的调用者选择将结果解释为带符号(-128127,在这种情况下为-32)或无符号(0255,在这种情况下为[ C0])。我猜想您是在问这个问题,因为调用此函数的代码错误地解释了它。如果您不小心在结果上使用了224而不是movzx来扩展它,或者更糟糕的是,如果不先扩展就使用了movsxaxeax,则可能会发生这种情况(在这种情况下,您可以最终会出现rax这样的完全垃圾。

© www.soinside.com 2019 - 2024. All rights reserved.