带括号的四则运算 汇编

  1 ;作者:HelloMsg
2 ;网址:http://www.cnblogs.com/wbb2109/
3 ;邮箱:hellomsg_noreply@163.com
4 ;时间:2011.11.26
5 ;带括号的四则运算
6 ;算法:1.将键盘输入的计算式(中缀式)存入array1中sub8;
7 ; 2.将中缀式转换为后缀式存入array2中,算法思想:
8 ; 从左至右逐字(word)读取array1中的内容:
9 ; a.当当前字符为数字时,直接输出到array2;
10 ; b.当当前字符为"("时,将其压栈;
11 ; c.当当前字符为")"时,则弹出堆栈中最上的"("之前的所
12 ; 有运算符并输出到array2,然后删除堆栈中的"(" ;
13 ; d.当当前字符为运算符时,则依次弹出堆栈中优先级大于
14 ; 等于当前运算符的,存入array2.再将当前运算符压栈
15 ; c.当为"="时,弹出所有栈中的内容存入array2.
16 ; 3.建立一个栈,然后从左至右扫描array2,每遇到操作数
17 ; 就压入栈中,每遇到运算符号,就弹出栈顶的操作数,
18 ; 完成相应的操作并把结果再压入栈中。最后的结果将保
19 ; 留在栈顶。
20 ; 4.输出结果
21 ;提示:该程序只对输入操作数小于65280,每步运算结果小于65535的
22 ; 计算式有效。并且都是正整数。
23
24 assume cs:code,ds:data,ss:stack
25 data segment
26 array1 dw 100 dup(0) ;存放中缀表达式
27 array2 dw 100 dup(0) ;存放后缀表达式
28 ;operator '(','=','+','-','*','/',作者约定优先级别为0,0,1,1,2,2
29
30 data ends
31
32 stack segment
33 dw 100 dup(0)
34 stack ends
35
36 code segment
37 main proc far
38 mov ax,data
39 mov ds,ax
40 mov ax,stack
41 mov ss,ax
42 mov sp,200
43
44
45 call sub8
46 call sub9
47 call sub10
48
49 call sub11
50 mov ah,0
51 int 16h
52 main endp
53 ;使运算符高八位为0ffh,以区别内存中的操作数和运算符。
54 ;这就是为什么规定输入的操作数要小于65280 。
55 sub8 proc near ;将计算式按中缀式存入array1中
56 push ax
57 push bx
58 push dx
59 lea di,array1
60 xor cx,cx
61 aa2: mov ah,1
62 int 21h
63
64
65 cmp al,30h ;判断若小于48,则为运算符
66
67 jc aa5
68
69
70 cmp al,3ah ;判断若大于57,则为等于号
71 jnc aa1
72 add cx,cx ;否则为0~9,将其由ascii转换为数值
73 mov bx,cx
74 add cx,cx
75 add cx,cx
76 add cx,bx
77 and ax,0fh
78 add cx,ax
79
80 jmp aa2
81 aa3: mov [di],cx
82 inc di
83 inc di
84 mov cx,0 ;将数值存入内存,并cx赋0,标记其以存入内存
85
86 aa4: mov ah,0ffh ;通过高8位区别数字还是运算符
87 mov [di],ax
88 inc di
89 inc di
90 jmp aa2
91 aa5: cmp cx,0 ;判断前面输入的是不是数字
92 jz aa4
93 jmp aa3
94 aa6: mov [di],cx
95 inc di
96 inc di
97 mov cx,0
98 aa1: cmp cx,0 ;判断若在输入等号的前一位是数值
99 jnz aa6 ;则存入内存
100 mov ah,0ffh
101 mov [di],ax
102 pop dx
103 pop bx
104 pop ax
105 ret ;返主
106 sub8 endp
107
108
109 sub9 proc near ;中缀式转后缀式,存入array2
110 sub cx,cx
111 push ax
112 push bx
113 push dx
114 mov ax,'='
115 mov ah,0ffh
116 push ax
117 inc cx
118 lea di,array1
119 lea si,array2
120
121
122 bb1: mov ax,[di]
123 inc di
124 inc di
125 cmp ah,0ffh ;小于0ffh就为数字
126 jnc bb2 ;大于0ffh就为运算符
127 mov [si],ax
128 inc si
129 inc si
130 bb3: jmp bb1
131 bb2: cmp al,'('
132 jz bb4 ;若为“(”,则压入栈
133 cmp al,')' ;若为“)”,则弹出栈中最上的
134 jz bb5 ;'('之前的所有运算符并输出到array2
135 cmp al,'=' ;若为“=”,则弹出栈中的所有
136 jz bb6
137 bb11:mov bp,sp
138 cmp al,'+'
139 jz bb7
140 cmp al,'-'
141 jz bb7
142 cmp al,'*'
143 jz bb9
144 cmp al,'/'
145 jz bb9
146 bb4: push ax
147 inc cx
148 jmp bb1
149
150 bb5: pop ax
151 dec cx
152 cmp al,'('
153 jz bb1
154 ;cmp al,'='
155 ; jz bb6
156 mov [si],ax
157 inc si
158 inc si
159 jmp bb5
160
161
162 bb7: cmp byte ptr [bp],'+'
163 jz bb12
164 bb8: cmp byte ptr [bp],'-'
165 jz bb12
166 bb9: cmp byte ptr [bp],'*'
167 jz bb12
168 bb10:cmp byte ptr [bp],'/'
169 jz bb12
170 jmp bb4
171
172 bb12: pop bx
173 dec cx
174 mov [si],bx
175 inc si
176 inc si
177 jmp bb11
178
179 bb6: pop ax
180 mov [si],ax
181 inc si
182 inc si
183 loop bb6
184 pop dx
185 pop bx
186 pop ax
187 ret
188 sub9 endp
189 sub10 proc near
190 push ax
191 push bx
192 push dx
193
194 lea si,array2
195 pp1:mov ax,[si]
196 inc si
197 inc si
198 cmp ah,0ffh
199 jz pp2
200 push ax
201 jmp pp1
202 pp2:cmp al,'='
203 jz pp7
204 pop bx
205 pop dx
206 cmp al,'+'
207 jz pp3
208 cmp al,'-'
209 jz pp4
210 cmp al,'*'
211 jz pp5
212 cmp al,'/'
213 jz pp6
214
215
216 pp3:add dx,bx
217 push dx
218 jmp pp1
219 pp4:sub dx,bx
220 push dx
221 jmp pp1
222 pp5:mov ax,dx
223 mul bx
224 push ax ;用的是16位乘法,高位放在dx里,
225 jmp pp1 ;低位放在ax里,这里约定结果小于65535
226 pp6:mov ax,dx
227 mov dx,0 ;因为16位(除数)除法,则高16位默认在dx里,
228 ;所以要将dx置零
229 div bx ;ax存商,dx存 余数
230 push ax
231 jmp pp1
232 pp7:pop cx
233 pop dx
234 pop bx
235 pop ax
236 ret ;返主
237 sub10 endp
238 sub11 proc near ;将结果以十进制形式输出到屏幕
239 push ax
240 push bx
241 push dx
242 cmp cx,10000
243 jnc a12
244 cmp cx,1000
245 jnc a4
246 cmp cx,100
247 jnc a6
248 cmp cx,10
249 jnc a8
250 jmp a10
251 a12:mov dl,-1
252 a3: sub cx,10000
253 inc dl
254 jnc a3
255 add cx,10000
256 or dl,30h
257 mov ah,2
258 int 21h
259 a4: mov dl,-1
260 a5: sub cx,1000
261 inc dl
262 jnc a5
263 add cx,1000
264 or dl,30h
265 mov ah,2
266 int 21h
267 a6: mov dl,-1
268 a7: sub cx,100
269 inc dl
270 jnc a7
271 add cx,100
272 or dl,30h
273 mov ah,2
274 int 21h
275 a8: mov dl,-1
276 a9: sub cx,10
277 inc dl
278 jnc a9
279 add cx,10
280 or dl,30h
281 mov ah,2
282 int 21h
283 a10:mov dl,cl
284 or dl,30h
285 mov ah,2
286 int 21h
287 pop dx
288 pop bx
289 pop ax
290 ret ;返主
291 sub11 endp
292
293 code ends
294 end main


posted @ 2011-11-26 20:53  hellomsg  阅读(4003)  评论(0编辑  收藏  举报