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

 

 

 

这里写得比较乱,我也没办法,跳来跳去,郁闷,要改进呀!

posted on 2010-04-20 00:38  KuSiuloong  阅读(305)  评论(0编辑  收藏  举报