【问题标题】:Is it possible to multiply using ONLY shift and rotate?是否可以仅使用移位和旋转进行乘法?
【发布时间】:2016-04-14 00:30:51
【问题描述】:

我在使用 shift 和 add 进行乘法时发现了这个 thread,并且我知道如何使它工作。但是是否可以仅使用 Shift 和 Rotate 进行乘法运算。

【问题讨论】:

  • 只要乘以 2 的幂,就可以。

标签: assembly masm


【解决方案1】:

非常模糊。

如果您的意思是“没有加减法”,那么是的。

如果您有一个只包含 1 和另一个只包含零的寄存器,那么 (intel) RCR 将允许您将 cary 标志设置为 1 或 0。

所以 - 如果你使用 sth like (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 个数字相加,因此您可以将任意数量的数字相加,而相乘只需将 register1 与 register2 相加即可。

因此,这是可能的。乏味,但可能。


经过一番思考……

再次给出(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。可能需要一台电脑给你写……

【讨论】:

  • 如果你的 all 是“shift”和“rotate”,我认为你不会成功。您至少需要完整的布尔逻辑,例如,not + and(或只是 nand 等)您正在通过执行顺序测试和跳转来执行“and”,并且您可以通过“jmp not condition”得到 not。没关系,但重要的是要注意基于 OP 提出的明确问题的成功。给定一堆 8 位寄存器,只有 RCL(或只是 RCR)和 JC,我怀疑你有足够的图灵能力。 (添加,比较,跳转条件就足够了)。之后它只是神秘的代码:-}
  • 我已经对你的答案投了一次赞成票。不能再做一次了,只是为了愚蠢地坚持下去。我只愿意写评论:-}
  • 你比我耐心多了。干得好。
猜你喜欢
  • 2011-02-16
  • 1970-01-01
  • 2015-04-12
  • 2016-06-29
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多