不使用算术指令将两个 16 位数字相乘

问题描述

我要在 emu 8086 微处理器中不使用 MUL 将两个 16 位数字相乘 下面是我是怎么做的

MOV AX,000H
MOV DX,AX
MOV AL,[4000H]
MOV CL,[4002H]
ADD AL,CL
MOV [4003H],AL
DAA
MOV AL,[4004H]
MOV CL,[4005H]
ADC AL,CL
MOV [4006H],[000H]
ADC AL,AL
MOV [4007H],AL
HLT

enter image description here

但我认为答案不正确

解决方法

我不精通汇编,但只使用按位运算和加法的算法可能看起来像这样

multiply (unsigned int a,unsigned int b) {
  if (a == 0 || b == 0) return 0;
  int c = 0;
  while (a != 0) {
    if (a & 1) {
      c += b;
    }
    a = a >> 1;
    b = b << 1;
  }
  return c;
}