Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly x86汇编-如何使用SHR有效地将负数减半?_Assembly_X86_Cpu Registers - Fatal编程技术网

Assembly x86汇编-如何使用SHR有效地将负数减半?

Assembly x86汇编-如何使用SHR有效地将负数减半?,assembly,x86,cpu-registers,Assembly,X86,Cpu Registers,我使用SHL/SHR将寄存器中的数字减半。它实际上可以很好地处理正数和负数;然而,关于负数,有一些东西让我感到不安 在我继续之前,我应该说我知道SAR和SAL可以转换有符号二进制,但是我需要特别使用SHL/SHR。我确实试过SAR和SAL,它们工作得很好,但我不能用它们 问题就这么简单了 如果我有一个数字,比如-5,它作为ffffffffb存储在寄存器中 但当我把它减半时,它被当作是4294967291。它仍然适用于我的目的,但不是将-5减半(这需要3个循环才能达到0),而是将这个庞大的数字减半

我使用SHL/SHR将寄存器中的数字减半。它实际上可以很好地处理正数和负数;然而,关于负数,有一些东西让我感到不安

在我继续之前,我应该说我知道SAR和SAL可以转换有符号二进制,但是我需要特别使用SHL/SHR。我确实试过SAR和SAL,它们工作得很好,但我不能用它们

问题就这么简单了

如果我有一个数字,比如-5,它作为ffffffffb存储在寄存器中

但当我把它减半时,它被当作是4294967291。它仍然适用于我的目的,但不是将-5减半(这需要3个循环才能达到0),而是将这个庞大的数字减半,并需要更多的循环32个循环。这让我感到厌烦,因为它效率很低。有没有办法让它把它看成是-5而不是4294967291

我想检查一下这个数字是否是负数,把它存储在一个寄存器里。是否将其视为阳性进行处理,然后检查我的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。

如果您知道sar,那么您就知道它的功能。所以,使用shr和其他一些东西来模拟它。附言:你的方法也行。不要期望任何有效的东西,因为有效的效率?注意,这个移位除法对于值-1sar-1==-1是不正确的,不是零。否则,sar是最好的解决方案。如果你不能使用sar,只能使用其他指令,那么你应该研究sar的功能,并用其他指令对其进行仿真。好奇为什么会出现问题。为什么向右移动也会移动符号位,并作为副作用使其成为一个巨大的正数?存储符号不是唯一的目的吗?在什么情况下将其移出位置会有用?符号位是32位值的顶部位。如果要将该值视为无符号的,那么顶部的位就是最高的位,而不是符号位。这就是二的补码的优点。无符号值0x8000000可以右移一次减半:0x40000000。在汇编程序中,32位是32位,这取决于您是要将它们视为有符号还是无符号。@Duxa:您是通过坚持在零中进行shr移位而不是在符号位的副本中进行sar移位来为自己制造这个问题的。这段代码完全模拟sar eax,1加上重击EDX,并且100%没有意义,除非您只是试图理解sar。对于正常人来说,这个问题并不存在;他们用合成孔径雷达做2的补码算术右移。@PeterCordes在原始的合成孔径雷达文章中提到的是不允许的。这是一个编程练习,限制了您使用的工具。如果你必须用锤子钉钉子,而且有锤子,那么它就没有意义了,不是吗?如果你不能用金属做的东西怎么办?好吧,那么你可以在学习的过程中学到一两件事。@Duxa:当然,学习练习是可以的,但是你首先问为什么会有问题,并希望有一个特别处理符号位的转换。正如我所说,这是存在的,它被称为SAR,所以这不是一个真正的问题。另外,您还需要在符号位的副本中移动2的补码。对于符号/幅度算术右移,只有影响低位31位才是正确的。除了这会给它不同的舍入语义:x>>1`向-inf舍入,所以-1>>1=-1,但是x/2向0截断。我们还需要一个逻辑/无符号移位,这就是SHR。