我正在使用SHL
/SHR
以将寄存器中的数字减半。它对于正数和负数都可以正常工作。然而,有些东西正在扰乱我对负数的看法。x86程序集 - 如何使用SHR将负数有效减半?
我去之前,我应该说我知道的SAR
和SAL
转移符号二进制,但我需要使用SHL
/SHR
明确。 (我尝试了SAR
和SAL
和那些工作很好 - 但我不能使用那些)
所以就这个问题。
如果我有一个数字,让我们说-5,这是存储在寄存器中的“FFFFFFFB”。
但是,当我SHR
它(将它减半)它被视为如果它是4,294,967,291。它仍然适用于我的目的,但不是减半(这将需要3个循环来达到0),它将这个庞大的数字减半,并且取代更多的循环(32个循环)。这让我感到非常低效。有没有把它看成是-5而不是4,294,967,291的技巧?
我正在考虑检查数字是否为负值,并将其存储在寄存器中。做它的工作,如果它是积极的,然后检查我的neg/pos寄存器并相应地分配标志?
但是这种方法听起来不合适吗?
但是,我又是新来的汇编,并不真正知道这是我希望为这种类型的问题做的事情?
如果你知道'sar',那么你知道它做了什么。所以,用'shr'和其他东西来模拟它。 PS:你的意见也会起作用。不要指望任何“有效”的东西,因为有效的(高效的)方法是'sar'。 – Jester
请注意,这个移位除法对值-1不正确(sar -1 == -1,不为零)。否则'sar'就是最好的解决方案。如果你不能使用'sar',只能使用其他指令,那么你应该研究'sar'做什么,并用其他指令来模拟它。 – Ped7g