我一直坚持一个相当简单的指令,但是直到我试图真正理解它之前,汇编中的所有内容似乎都很简单。我已经关注了该帖子,该帖子澄清了一些内容,但我仍然感到困惑: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,但是对我来说似乎有点不可思议,有一种更简洁的方法吗?
8位值224
和-32
在x86和x86-64上相同,因为它使用two's complement表示负数。减去256将无济于事。由函数的调用者选择将结果解释为带符号(-128
至127
,在这种情况下为-32
)或无符号(0
至255
,在这种情况下为[ C0])。我猜想您是在问这个问题,因为调用此函数的代码错误地解释了它。如果您不小心在结果上使用了224
而不是movzx
来扩展它,或者更糟糕的是,如果不先扩展就使用了movsx
,ax
或eax
,则可能会发生这种情况(在这种情况下,您可以最终会出现rax
这样的完全垃圾。