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

我一直停留在一个相当简单的指令上,但是汇编中的所有内容似乎都很简单,直到我尝试真正理解它为止。 我已经关注了该帖子,该帖子澄清了一些内容,但我仍然感到困惑: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 ...但是对我来说似乎有点怪异,有一种更清洁的方法吗?

iCMS 回答:从子指令x86_64中获得否定结果

8位值224-32在x86和x86-64上相同,因为它使用two's complement表示负数。减去256将无济于事。由函数的调用者选择将结果解释为带符号(-128127,在这种情况下为-32)或无符号(0至{ {1}},在这种情况下为255)。我认为您是在问这个问题,因为调用此函数的代码错误地解释了它。如果您不小心在结果上使用224而不是movzx来扩展结果,或者更糟糕的是,如果您使用movsxaxeax而不先扩展它(在这种情况下,您可能会遇到像rax这样的完整垃圾)。

本文链接:https://www.f2er.com/2139039.html

大家都在问