是否可以仅使用移位和旋转进行乘法运算?
Is it possible to multiply using ONLY shift and rotate?
我在使用 shift 和 add 相乘时发现了这个 thread,我知道如何让它工作。但是是否可以仅使用 Shift 和 Rotate 进行乘法运算。
非常模糊。
如果你的意思是 "without add and subtract" 那么是的。
如果您有一个只包含 1 的寄存器而另一个只包含零,那么 (intel) RCR 将允许您将进位标志设置为 1 或 0。
所以 - 如果你使用像 (BH=FF BL=0) 这样的东西;想把 DH 添加到 DL
rcr DL,1 ;DL0 to carry
jc DL1 ;it was a 1
rcr DH,1 ;DH0 to carry
;CY now has result DL0=0 + DH0=0=00; DL0=0 + DH0=1=01
rcr CL,1 ;CY to CL7
rcr BL,1 ;0 to CY, BL unchanged
rcl CL,1 ;CL0=0, CY=0 or 1
rcl CL,1 ;CL01=00 or 01
jmp done1 ;finished adding
DL1:
rcr DH,1 ;DH0 to carry. DL0 was 1, so result=10 if CY set, 01 if not
jc DHDL10 ;result is 10
rcl CL,1 ;CL0=0
rcr BH,1 ;1 to CY, BH unchanged
rcl CL,1 ;CL0=01
jmp done1 ;finished adding
DHDL10:
rcl CL,1 ;CL0=1
rcr BL,1 ;0 to CY, BL unchanged
rcl CL,1 ;CL01=10
done1:
此例程应将 DL 和 DH 的最低位相加,给出 CL 的最低 2 位。
从那里,您可以调用它来将 2 个寄存器加在一起 - 这只是重复移位和加法的问题。 (我不是说这会很愉快,只是可以如果你有足够的决心)
由于可以将 2 个数字相加,因此可以将任意数量的数字相加,相乘只需将寄存器 1 与寄存器 2 相加即可。
因此,这是可能的。乏味,但可能。
经过一番思考...
再次给出(BH=FF BL=0);想把 DH 添加到 DL
rcr DL,1 ;DL0 to CY
jc DL1
DL0:
rcr DL,1
jc DL01
DL00:
...
DL01:
rcr DL,1
jc DL011
DL010:
...
DL01000000:
rcr DH,1
jc DL01000000H1
DL01000000H0:
rcr DH,1
jc DL01000000H01
...
DL00010000H00100000: ;8*4=32 - note bit-order reversed dur RCR, RCL = conventional
; all we need here is to use BH/BL and RCR to build result.
...
所以 - 这是一个冗长、复杂、乏味的方法,可以简单地创建一个 256*256 的可能结果列表,机械地评估每对可能的输入值 BUT 仅使用两条指令.可能需要电脑给你写...
我在使用 shift 和 add 相乘时发现了这个 thread,我知道如何让它工作。但是是否可以仅使用 Shift 和 Rotate 进行乘法运算。
非常模糊。
如果你的意思是 "without add and subtract" 那么是的。
如果您有一个只包含 1 的寄存器而另一个只包含零,那么 (intel) RCR 将允许您将进位标志设置为 1 或 0。
所以 - 如果你使用像 (BH=FF BL=0) 这样的东西;想把 DH 添加到 DL
rcr DL,1 ;DL0 to carry
jc DL1 ;it was a 1
rcr DH,1 ;DH0 to carry
;CY now has result DL0=0 + DH0=0=00; DL0=0 + DH0=1=01
rcr CL,1 ;CY to CL7
rcr BL,1 ;0 to CY, BL unchanged
rcl CL,1 ;CL0=0, CY=0 or 1
rcl CL,1 ;CL01=00 or 01
jmp done1 ;finished adding
DL1:
rcr DH,1 ;DH0 to carry. DL0 was 1, so result=10 if CY set, 01 if not
jc DHDL10 ;result is 10
rcl CL,1 ;CL0=0
rcr BH,1 ;1 to CY, BH unchanged
rcl CL,1 ;CL0=01
jmp done1 ;finished adding
DHDL10:
rcl CL,1 ;CL0=1
rcr BL,1 ;0 to CY, BL unchanged
rcl CL,1 ;CL01=10
done1:
此例程应将 DL 和 DH 的最低位相加,给出 CL 的最低 2 位。
从那里,您可以调用它来将 2 个寄存器加在一起 - 这只是重复移位和加法的问题。 (我不是说这会很愉快,只是可以如果你有足够的决心)
由于可以将 2 个数字相加,因此可以将任意数量的数字相加,相乘只需将寄存器 1 与寄存器 2 相加即可。
因此,这是可能的。乏味,但可能。
经过一番思考...
再次给出(BH=FF BL=0);想把 DH 添加到 DL
rcr DL,1 ;DL0 to CY
jc DL1
DL0:
rcr DL,1
jc DL01
DL00:
...
DL01:
rcr DL,1
jc DL011
DL010:
...
DL01000000:
rcr DH,1
jc DL01000000H1
DL01000000H0:
rcr DH,1
jc DL01000000H01
...
DL00010000H00100000: ;8*4=32 - note bit-order reversed dur RCR, RCL = conventional
; all we need here is to use BH/BL and RCR to build result.
...
所以 - 这是一个冗长、复杂、乏味的方法,可以简单地创建一个 256*256 的可能结果列表,机械地评估每对可能的输入值 BUT 仅使用两条指令.可能需要电脑给你写...