Assembly 8086汇编SHR指令除以3问题

Assembly 8086汇编SHR指令除以3问题,assembly,masm,bit-shift,emu8086,integer-division,Assembly,Masm,Bit Shift,Emu8086,Integer Division,我知道shr除法是如何工作的,但它只除掉偶数。我想把这个数字除以3。这个问题的汇编8086代码是什么?谢谢。除以3等于乘以1/3。二进制的1/3是0.010101 所以在伪代码中: sum:=0 tmp:=IN while (tmp>0) { shr tmp, 2 sum += tmp } OUT:=sum 除以3等于乘以1/3。二进制的1/3是0.010101 所以在伪代码中: sum:=0 tmp:=IN while (tmp>0) { shr tmp, 2 s

我知道shr除法是如何工作的,但它只除掉偶数。我想把这个数字除以3。这个问题的汇编8086代码是什么?谢谢。

除以3等于乘以1/3。二进制的1/3是0.010101

所以在伪代码中:

sum:=0
tmp:=IN
while (tmp>0) {
  shr tmp, 2
  sum += tmp
}
OUT:=sum

除以3等于乘以1/3。二进制的1/3是0.010101

所以在伪代码中:

sum:=0
tmp:=IN
while (tmp>0) {
  shr tmp, 2
  sum += tmp
}
OUT:=sum

除了2的幂外,不能单独使用右移进行除法。可以使用
div
作为一种简单(但速度较慢)的方法来除法任意数字,或者查看如何使用乘法,类似于dratenik的答案,但使用
mul
。也可以使用仅对大数字不准确的更快算法,请参阅。此外,还演示了如何在循环中仅使用移位和adc/adc(而不是带有魔常数的mul)进行除法。设计的二进制位移位意味着按2的幂进行乘法(或除法)。对于8086,您最好的选择是
div
指令,请看您不能单独使用右移除以2的幂。您可以使用
div
作为一种简单(但缓慢)的方法除以任意数字,或者查看如何使用乘法,与dratenik的答案类似,但使用的是
mul
。也可以使用仅对大数字不准确的更快算法,请参阅。此外,还演示了如何在循环中仅使用移位和adc/adc(而不是带有魔常数的mul)进行除法。设计的二进制位移位意味着按2的幂进行乘法(或除法)。对于8086,您最好的选择是
div
指令,请参阅有趣的想法,但不要太精确:从1到500,这将得到19个正确答案;通常低于1。演示如何正确地对运行时变量除数进行右移(和add/adc)的精确除法。如果你想优化已知常数3,这可能是一个很好的起点。有趣的想法,但不太准确:从1到500,这得到19个正确答案;通常低于1。演示如何正确地对运行时变量除数进行右移(和add/adc)的精确除法。如果你想优化已知常数3,这可能是一个很好的起点。