x86 assembly - 如何使用 SHR 有效地将负数减半?
x86 assembly - How to use SHR to halve a negative number effectively?
我正在使用 SHL
/SHR
将寄存器中的数字减半。它实际上对正数和负数都适用;然而,负数让我有些烦恼。
在我继续之前我应该说我知道 SAR
和 SAL
来移动带符号的二进制文件,但我需要专门使用 SHL
/SHR
。 (我确实尝试了 SAR
和 SAL
,它们效果很好 - 但我不能使用它们)
问题继续。
如果我有一个数字,比如说-5,它在寄存器中存储为"FFFFFFFB"。
但是当我 SHR
它(减半)时,它被视为 4,294,967,291。它仍然适用于我的目的,但不是将 -5 减半(需要 3 个循环才能达到 0),而是将这个巨大的数字减半并采用更多循环(32 个循环)。这让我觉得效率很低。是否有技巧让它将其视为 -5 而不是 4,294,967,291?
我想检查数字是否为负数,将其存储在寄存器中。就好像它是正的一样处理它,然后检查我的 neg/pos 寄存器并相应地分配符号?
但我觉得这种方法不对?
但是话又说回来,我是装配新手,真的不知道我是否应该为这类问题做这种事情?
如您所料,您必须记住符号位:
MOV EAX,[TheValue]
MOV EDX,EAX
AND EDX,0x80000000 ; remember sign bit from EAX
SHR EAX,1
OR EAX,EDX ; and put it back
这将正确地将正值和负值减半。结果在 EAX 中。
我正在使用 SHL
/SHR
将寄存器中的数字减半。它实际上对正数和负数都适用;然而,负数让我有些烦恼。
在我继续之前我应该说我知道 SAR
和 SAL
来移动带符号的二进制文件,但我需要专门使用 SHL
/SHR
。 (我确实尝试了 SAR
和 SAL
,它们效果很好 - 但我不能使用它们)
问题继续。
如果我有一个数字,比如说-5,它在寄存器中存储为"FFFFFFFB"。
但是当我 SHR
它(减半)时,它被视为 4,294,967,291。它仍然适用于我的目的,但不是将 -5 减半(需要 3 个循环才能达到 0),而是将这个巨大的数字减半并采用更多循环(32 个循环)。这让我觉得效率很低。是否有技巧让它将其视为 -5 而不是 4,294,967,291?
我想检查数字是否为负数,将其存储在寄存器中。就好像它是正的一样处理它,然后检查我的 neg/pos 寄存器并相应地分配符号?
但我觉得这种方法不对?
但是话又说回来,我是装配新手,真的不知道我是否应该为这类问题做这种事情?
如您所料,您必须记住符号位:
MOV EAX,[TheValue]
MOV EDX,EAX
AND EDX,0x80000000 ; remember sign bit from EAX
SHR EAX,1
OR EAX,EDX ; and put it back
这将正确地将正值和负值减半。结果在 EAX 中。