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