本文使用汇编语言描述两个长整数相乘的过程

STACKS  SEGMENT  STACK
DW    100 DUP(?)
TOP   LABEL WORD
STACKS ENDS

DATAS   SEGMENT
NUM1 DW 9,9,8,7,4,5,6,7,8,9
NUM2 DW 6,4,5,6,7,8,9          ;定义两个数字,首位存放num的长度,这两个数字将用于做乘法运算
S    DW  300H DUP(0)           ;s用于存放结果
DATAS ENDS

CODES   SEGMENT
ASSUME  CS:CODES,DS:DATAS,SS:STACKS
MAIN  PROC FAR
MOV  AX,STACKS
MOV  SS,AX
LEA  SP,TOP
MOV  AX,DATAS
MOV  DS,AX

LEA   SI,NUM1
LEA   DI,NUM2
LEA   BX,S
ADD   SI,2
ADD   DI,2         ;加2的原因是因为第一位是数字的个数,从第二个数字开始才是真正的数,因为是DW的所以需要+2

MOV   CX,NUM1
JIN1:     PUSH  [SI]
ADD   SI,2
LOOP  JIN1

LEA   SI,NUM1
ADD   SI,2
MOV   CX,NUM1
CHU1:     POP   [SI]
ADD   SI,2
LOOP  CHU1          ;进栈出栈的目的是为了倒置该字符串用于乘法运算

MOV   CX,NUM2
JIN2:     PUSH  [DI]
ADD   DI,2
LOOP  JIN2

LEA   DI,NUM2
ADD   DI,2
MOV   CX,NUM2
CHU2:     POP   [DI]
ADD   DI,2
LOOP  CHU2          ;同上

LEA   SI,NUM1
LEA   DI,NUM2
LEA   BX,S
ADD   SI,2
ADD   DI,2

MOV   CX,NUM1       ;二重循环,把每个数都相乘,并存在s的对应位置,如果该位置里有值,则加上该值
L1:          PUSH  CX
MOV   CX,NUM2
PUSH  BX
PUSH  DI
L2:      MOV   DX,[SI]
MOV   AX,[DI]
MUL   DX
ADD   DI,2
ADD   AX,[BX]
MOV   [BX],AX
ADD   BX,2

LOOP L2
POP  DI
POP  BX
ADD  BX,2
POP  CX
ADD  SI,2
LOOP L1

XOR   DX,DX
LEA    BX,S
MOV    CX,NUM1
ADD    CX,NUM2          ;将s中每一个数除以10,余数放回原位,商作为进位
L4:      MOV    AX,[BX]
ADD    AX,DX
MOV    DL,10
DIV    DL
MOV    DL,AH
MOV    [BX],DX
MOV    DL,AL

ADD    BX,2
LOOP L4

MOV    CX,NUM1
ADD    CX,NUM2

L5:  SUB    BX,2                ;逆序,输出结果
MOV    DX,[BX]
ADD    DX,30H
MOV    AH,2
INT    21H

LOOP L5

L10:  MOV   AH,4CH
INT   21H
MAIN  ENDP
CODES ENDS
END MAIN