汇编--两长整数相乘

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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
-->