1
STA SEGMENT STACK
2 DW 40H DUP(?)
3 TOP LABEL WORD
4 STA ENDS
5
6 DATA SEGMENT
7
8 ARY DW 300 DUP(?)
9 CRLF DB 0DH,0AH,24H
10 DATA ENDS
11
12 CODE SEGMENT
13 ASSUME CS: CODE, SS: STA, DS: DATA
14
15 MAIN PROC FAR
16 MOV AX,STA
17 MOV SS,AX
18 LEA SP,TOP
19 MOV AX,DATA
20 MOV DS,AX
21
22
23
24 MOV BP, 0 ; BP计数输入了多少个16进制数
25 MOV SI, 0
26 L33: MOV CX, 5
27
28 XOR BX,BX
29 L22: MOV AH, 1
30 INT 21H
31
32 CMP AL, ' ' ; 以空格判断一个数是否输完
33 JE L34
34
35
36 CMP AL,0DH
37 JE L35
38
39 CMP AL,30H ; 判断0~9之间的数
40 JB L22
41 CMP AL,39H
42 JBE L23 ; 若为数字,跳到L23行
43
44
45
46 CMP AL,41H ; 判断在A~F之间
47 JB L22
48 CMP AL,46H
49 JBE L24 ; 若为A~F范围数跳到24行
50
51
52
53 CMP AL,61H ; 判断a~f范围数
54 JB L22
55 CMP AL,66H
56 JA L22
57
58 SUB AL,20H ; 若为小写字母,则先减20跳到大写字母处
59
60 L24: SUB AL, 7 ; 大写,减7得到对应的数字代表
61
62 L23: SUB AL,30H
63 PUSH CX ; 先把计数的CX进栈,因为后面要用到
64 MOV CL, 4
65 SHL BX,CL
66 ADD BL,AL
67 POP CX
68 LOOP L22
69
70 L34: MOV ARY[SI],BX ; 输入的数存入内存中
71 ADD SI, 2
72 INC BP
73 JMP L33
74
75
76 L35:
77
78 MOV ARY[SI],BX ; 因为判断回车那里没把回车前的数存入内存,这里补回
79
80 INC BP
81
82
83 MOV AH, 9
84 LEA DX,CRLF
85 INT 21H
86
87
88
89
90 MOV SI, 0
91
92 L1:
93 MOV BX,ARY[SI]
94 OR BX,BX
95 JNS L20 ; 若sp为0时转移
96
97
98
99 MOV DL, ' - '
100 MOV AH, 2
101 INT 21H
102 NEG BX
103
104
105
106 L20:
107
108 MOV AX,BX
109 MOV CX, 0
110
111 L30: XOR DX,DX
112 MOV BX, 10
113 DIV BX
114 PUSH DX
115 INC CX
116 CMP AX, 0
117 JNE L30 ; 得出的十进制数进栈
118
119
120 L4: POP DX
121 ADD DL,30H
122 MOV AH, 2
123 INT 21H
124 LOOP L4
125
126 MOV DL, ' '
127 MOV AH, 2
128 INT 21H
129 ADD SI, 2
130 DEC BP
131 JNE L1
132
133
134
135 MOV AH,4CH
136 INT 21H
137 MAIN ENDP
138 CODE ENDS
139 END MAIN
140
2 DW 40H DUP(?)
3 TOP LABEL WORD
4 STA ENDS
5
6 DATA SEGMENT
7
8 ARY DW 300 DUP(?)
9 CRLF DB 0DH,0AH,24H
10 DATA ENDS
11
12 CODE SEGMENT
13 ASSUME CS: CODE, SS: STA, DS: DATA
14
15 MAIN PROC FAR
16 MOV AX,STA
17 MOV SS,AX
18 LEA SP,TOP
19 MOV AX,DATA
20 MOV DS,AX
21
22
23
24 MOV BP, 0 ; BP计数输入了多少个16进制数
25 MOV SI, 0
26 L33: MOV CX, 5
27
28 XOR BX,BX
29 L22: MOV AH, 1
30 INT 21H
31
32 CMP AL, ' ' ; 以空格判断一个数是否输完
33 JE L34
34
35
36 CMP AL,0DH
37 JE L35
38
39 CMP AL,30H ; 判断0~9之间的数
40 JB L22
41 CMP AL,39H
42 JBE L23 ; 若为数字,跳到L23行
43
44
45
46 CMP AL,41H ; 判断在A~F之间
47 JB L22
48 CMP AL,46H
49 JBE L24 ; 若为A~F范围数跳到24行
50
51
52
53 CMP AL,61H ; 判断a~f范围数
54 JB L22
55 CMP AL,66H
56 JA L22
57
58 SUB AL,20H ; 若为小写字母,则先减20跳到大写字母处
59
60 L24: SUB AL, 7 ; 大写,减7得到对应的数字代表
61
62 L23: SUB AL,30H
63 PUSH CX ; 先把计数的CX进栈,因为后面要用到
64 MOV CL, 4
65 SHL BX,CL
66 ADD BL,AL
67 POP CX
68 LOOP L22
69
70 L34: MOV ARY[SI],BX ; 输入的数存入内存中
71 ADD SI, 2
72 INC BP
73 JMP L33
74
75
76 L35:
77
78 MOV ARY[SI],BX ; 因为判断回车那里没把回车前的数存入内存,这里补回
79
80 INC BP
81
82
83 MOV AH, 9
84 LEA DX,CRLF
85 INT 21H
86
87
88
89
90 MOV SI, 0
91
92 L1:
93 MOV BX,ARY[SI]
94 OR BX,BX
95 JNS L20 ; 若sp为0时转移
96
97
98
99 MOV DL, ' - '
100 MOV AH, 2
101 INT 21H
102 NEG BX
103
104
105
106 L20:
107
108 MOV AX,BX
109 MOV CX, 0
110
111 L30: XOR DX,DX
112 MOV BX, 10
113 DIV BX
114 PUSH DX
115 INC CX
116 CMP AX, 0
117 JNE L30 ; 得出的十进制数进栈
118
119
120 L4: POP DX
121 ADD DL,30H
122 MOV AH, 2
123 INT 21H
124 LOOP L4
125
126 MOV DL, ' '
127 MOV AH, 2
128 INT 21H
129 ADD SI, 2
130 DEC BP
131 JNE L1
132
133
134
135 MOV AH,4CH
136 INT 21H
137 MAIN ENDP
138 CODE ENDS
139 END MAIN
140
这里写得比较乱,我也没办法,跳来跳去,郁闷,要改进呀!