assembly 不使用mul或imul指令的两个16位数的乘法

dzhpxtsq  于 2023-06-06  发布在  其他
关注(0)|答案(2)|浏览(118)

我将在emu8086微处理器中不使用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], AL
DAA
MOV AL,[000H]
ADC AL, AL
MOV [4007H],AL
HLT

但我认为答案是不正确的。

p5cysglq

p5cysglq1#

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

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;
}
pb3s4cty

pb3s4cty2#

MOV AX, 0000H
MOV BX, [2000H]
MOV CX, [2002H]
MOV DX, 0000H
MOV SI, 000FH

LOOP:
SHR CX, 1
JC ADDITION

ADDITION:
ADD AX, BX

SHR BX, 1

DEC SI
JNZ LOOP

MOV [2004H], AX
HLT

enter image description here

相关问题