更新时间:2023-11-03 09:41:19
你们好,最近小艾特发现有诸多的小伙伴们对于关于汇编语言程序相对于高级程序设计语言,关于汇编语言程序这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。
1、 下载安装emu8086(8086装配仿真工具),打开运行软件,新文件命名为xiaobocalculator.asm
2、 输入以下代码
3、 ;==将值赋给DD数字X的宏==将Y的值赋给DD类型的两个数字X和Y。
4、 give macro x,y
5、 mov ax,y
6、 mov x,ax
7、 mov ax,y[2]
8、 mov x[2],ax
9、 endm
10、 ;* *将值赋给DD数字X的宏* *将Y的值赋给DD类型的两个数字X和Y。
11、 ;==判断正反宏==用两个常数fhx和fhy判断DD型X和Y的正反,并记录下来。
12、 ;都换算成正数便于操作。
13、 judge macro x,y
14、 本地判断1、判断2、判断3、判断4;标签注释,用于确保宏的重复调用。
15、 ;定位标签挺乱的。
16、 mov ax,x
17、 cmp ax,0
18、 jge judge1
19、 mov fhx,1;记录x的正负。
20、 阴性x;转换成正数
21、 judge1:
22、 mov ax,x[2]
23、 cmp ax,0
24、 jge judge2
25、 mov fhx,1
26、 neg x[2]
27、 judge2:
28、 mov ax,y
29、 cmp ax,0
30、 jge judge3
31、 mov fhy,1
32、 neg y
33、 judge3:
34、 mov ax,y[2]
35、 cmp ax,0
36、 jge judge4
37、 mov fhy,1
38、 neg y[2]
39、 judge4:
40、 endm
41、 ;* *正负宏判断结束* *
42、 ;==根据中间Y值的0,1将X结果变为正值或负值==
43、 change macro x,y
44、 local change1
45、 cmp y,0
46、 je change1
47、 neg x
48、 neg x[2]
49、 change1:
50、 endm
51、 ;* *根据中间Y值的0,1,将X结果变为正值或负值* *
52、 ;==进位宏的开始==小数部分除以100,进位商,将余数补足到小数。
53、 carry macro x
54、 推CX;避免干扰宏外部的CX和DX值。
55、 push dx
56、 mov ax,x[2]
57、 mov cx,100
58、 mov dx,0
59、 div cx
60、 mov x[2],dx
61、 add x,ax
62、 pop dx
63、 pop cx
64、 endm
65、 ;* *进位宏结束* *
66、 ;==新加法宏开始==算法,用相同的符号加法,用不同的符号减法。
67、 newadd macro x,y
68、 local subsub,endnewadd,returnadd1,xbig,endadd1,endadd2,endadd3,endadda,endaddc
69、 Referee number three, referee number four; Can't directly substitute x, y.
70、 ;x实际上既是$ NUMBER 3又是$ number4。原因,下面有说明。
71、 mov ax,fhx
72、 cmp fhy,ax
73、 jnesubsub
74、 ;-如果两个数符号相等,则两部分直接相加。
75、 mov ax,y
76、 addx,ax
77、 mov ax,y[2]
78、 add x[2],ax
79、 carry number3
80、 change number3,fhx
81、 jmp endnewadd
82、 ;-如果符号相反,从大数中减去小数。
83、 subsub:
84、 mov ax,y
85、 cmp x,ax
86、 jaxbig
87、 jne endadda
88、 mov ax,y[2]
89、 cmp x[2],ax
90、 ja xbig
91、 endadda:
92、 mov ax,x
93、 sub y,ax
94、 add y[2],100
95、 mov ax,x[2]
96、 sub y[2],ax
97、 cmp y[2],100
98、 jnb endadd1
99、 sub y,1
100、 jmp endaddc
101、 endadd1:
102、 sub y[2],100
103、 endaddc:
104、 give number3,number4
105、 change number3,fhy
106、 jmp endnewadd
107、 xbig:
108、 mov ax,y
109、 sub x,ax
110、 add x[2],100
111、 mov ax,y[2]
112、 sub x[2],ax
113、 cmp x[2],100
114、 jnb endadd2
115、 sub x,1
116、 jmp endadd3
117、 endadd2:
118、 sub x[2],100
119、 endadd3:
120、 change number3,fhx
121、 jmp endnewadd
122、 endnewadd:
123、 mov fhx,0
124、 mov fhy,0
125、 endm
126、 ;* *新增宏结束* *
127、 ;==新减法宏==
128、 newsub macro x,y
129、 mov fhx,1
130、 change number4,fhx
131、 mov fhx,0
132、 newadd number3,number4
133、 endm
134、 ;* *新减法宏* *
135、 ;==新乘法宏==算法(A1 B1)*(a2 B2)=A1 * a2 A1 * B2 a2 * 1 B1 * B2
136、 newmul macro x,y
137、 judge number3,number4
138、 push bx
139、 push dx
140、 mov bx,y
141、 mov ax,x
142、 mul bx
143、 推斧;堆叠用于以后添加。
144、 mov ax,x[2]
145、 mul bx
146、 推斧;正数部分乘以小数部分的结果可以直接加到小数部分。
147、 mov bx,y[2]
148、 mov ax,x
149、 mul bx
150、 push ax
151、 mov ax,x[2]
152、 mul bx
153、 mov dx,0
154、 mov bx,100;小数部分乘以小数部分的结果必须减少100倍。
155、 ;可以加回小数位
156、 div bx
157、 mov x[2],ax
158、 pop ax
159、 add x[2],ax
160、 pop ax
161、 add x[2],ax
162、 pop ax
163、 mov x,ax
164、 carry number3
165、 mov ax,fhy
166、 xor fhx,ax
167、 change number3,fhx
168、 mov fhx,0
169、 mov fhy,0
170、 pop dx
171、 pop bx
172、 endm
173、 ;* *新乘法宏* *
174、 ;==新除法宏==除法是由减法完成的,但是为了减少减法的次数,所以
175、 ;先用a1/(a2 ^ 1)求一个商,一定不能大于递减。
176、 ;次数,所以可以从(a1 b1)-商*(a2 b2)中减去。
177、 ;减去负数后,加上a (a2 b2)得到(a3 b3)。此时此刻
178、 ;等待的次数是结果的整数部分。最后,(a3 b3)*100
179、 ;按照前面的方法,可以得到结果的两个小数部分。
180、 newdiv macro x,y
181、 local endnewdiv
182、 push bx
183、 push dx
184、 push cx
185、 judge number3,number4
186、 give fhdx,fhx
187、 mov fhx,0
188、 mov fhy,0
189、 give divn4,number4
190、 intdiv number3,number4;求结果的整数部分
191、 mov bx,100;将减少的盈余扩大100倍。
192、 mov ax,number3
193、 mul bx
194、 mov number3,ax
195、 mov ax,数字3[2];小数位放大100倍,相当于直接输入整数位。
196、 add number3,ax
197、 mov number3[2],0
198、 give number4,divn4
199、 intdiv number3,number4;求结果的小数部分
200、 pop number3[2]
201、 pop number3
202、 endnewdiv:
203、 mov ax,fhdy
204、 xor fhdx,ax
205、 change number3,fhdx
206、 mov fhdx,0
207、 mov fhdy,0
208、 pop cx
209、 pop dx
210、 pop bx
211、 endm
212、 ;* *新部门宏* *
213、 ;==除法递减宏==
214、 intdiv macro x,y
215、 Local intdiv1, intdiv2, endintdiv; Embedded macro, used to decrease gradually
216、 mov ax,x
217、 mov bx,y
218、 add bx,1
219、 mov dx,0
220、 div bx
221、 push ax
222、 mov bx,y
223、 mul bx
224、 mov y,ax
225、 pop ax
226、 push ax
227、 mov bx,y[2]
228、 mul bx
229、 mov y[2],ax
230、 carry number4
231、 pop cx
232、 newsub number3,number4
233、 给数字4,divn4防止# number4的值在相减后被改变。
234、 intdiv1:
235、 newsub number3,number4
236、 give number4,divn4
237、 inc cx
238、 cmp number3,0
239、 jl endintdiv
240、 je intdiv2
241、 jmp intdiv1
242、 intdiv2:
243、 cmp number3[2],0
244、 jl endintdiv
245、 jmp intdiv1
246、 endintdiv:
247、 newadd number3,number4
248、 dec cx
249、 push cx
250、 endm
251、 ;* *除法递减宏* *
252、 ;==设置光标宏==
253、 curse macro cury,curx
254、 mov ah,2
255、 mov dh,cury
256、 mov dl,curx
257、 mov bh,0
258、 int 10h
259、 endm
260、 ;* *设置光标宏* *
261、 ;==定位字符串显示宏==
262、 菜单宏op1、op2、op3菜单显示宏定义了op3的内容显示到OP1和OP2的位置。
263、 mov ah,02h
264、 mov bh,00h
265、 mov dh,op1
266、 mov dl,op2
267、 int 10h
268、 mov ah,09h
269、 lea dx,op3
270、 int 21h
271、 endm
272、 ;* *定位字符串显示宏* *
273、 ;==清屏加彩色宏==
274、 scroll macro n,ulr,ulc,lrr,lrc,att
275、 mov ah,06
276、 mov al,n;N=卷起线的数量;当n=0时,整个窗口是空白的。
277、 mov ch,ulr左上角行号
278、 mov cl,ulc左上角列号
279、 mov dh,lrr右下角行号
280、 mov dl,lrc右下角的列号
281、 mov bh,att涉及的线属性
282、 int 10h
283、 endm
284、 ;* *清晰屏幕加彩色宏* *
285、 ;;;;;程序开始
286、 data segment
287、 fhx dw 0;记录x值的正负
288、 fhy dw 0;记录y值的正负
289、 fhdx dw 0;记录除法运算中的x值正负
290、 fhdy dw 0;记录除法运算中的y值正负
291、 divn4 dd 0;除法中帮助暂存number4
292、 number0 db 100;计入键盘输入字符串
293、 db 0
294、 db 100 dup(0);
295、 number dw 200 dup(0);存入输入公式处
296、 number2 dw 200 dup(0);读取去括号后的公式暂存处
297、 number3 dd 0;存储用于计算的x数
298、 number4 dd 0;存储用于计算的y数
299、 crx db 20;记录光标列
300、 cry db 10;记录光标行
301、 crx2 db 2;记录光标列2
302、 cry2 db 2;记录光标行2
303、 memb dw 0;记录bx中的值是否储存过
304、 memx db 0;记录是否应该进入小数存储部分
305、 memcl db 0;记录已经存储到小数的第几位
306、 rsi dw 0
307、 begain db 'Xiaobo Welcome you to use the calculator!','$'
308、 begain1 db 'data:2014/4/23','$'
309、 begain2 db '****Designed by 1wangxiaobo@163.com!****','$'
310、 begain3 db ' http://hi.baidu.com/yedeqixian','$'
311、 begain4 db ' ^Henan University of Economics and Law^$','$'
312、 begain5 db 'press 'E' key to exit','$'
313、 begain6 db 'press any key to contiune','$'
314、 begain7 db 'Press 'Enter' key to introudction','$'
315、 help db 'Confine:32512.99~(-32768.00)','$'
316、 help1 db 'Format: 1.32*99+(98.43/(-34))=','$'
317、 help2 db 'Notice 1:negative must like (-x)','$'
318、 help3 db ' 2:only can abet double decimal fraction as 567.33','$'
319、 help4 db 'press any key go on!','$'
320、 error1 db ' Error!',13,10,'$'
321、 DBUFFER DB 8 DUP (':'),12 DUP (' ');时间的底
322、 data ends
323、 code segment
324、 assume cs:code,ds:data,es:data
325、 start:
326、 mov ax,data
327、 mov ds,ax
328、 mov ax,data
329、 mov es,ax
330、 ;----欢迎界面-----
331、 scroll 0,0,0,24,79,0;清屏
332、 scroll 25,0,0,24,79,50h;开外窗口,品红底
333、 scroll 21,2,2,22,77,0fh;开内窗口,黑底白字
334、 menu 4,20,begain
335、 menu 6,20,begain1
336、 menu 8,20,begain2
337、 menu 10,20,begain3
338、 menu 12,20,begain4
339、 menu 14,20,begain5
340、 menu 16,20,begain6
341、 menu 18,20,begain7
342、 mov ah,01
343、 int 21h
344、 cmp al,0dh;'Enter'
345、 jne helpo
346、 scroll 21,2,2,22,77,0fh;清屏,内窗
347、 menu 6,20,help
348、 menu 8,20,help1
349、 menu 10,20,help2
350、 menu 12,20,help3
351、 menu 14,20,help4
352、 mov ah,01
353、 int 21h
354、 scroll 21,2,2,22,77,0fh;清屏,内窗
355、 jmp start1
356、 helpo:
357、 cmp al,45h;'E'
358、 je exit
359、 scroll 21,2,2,22,77,0fh;清屏,内窗
360、 ;----清零处理-----
361、 start1:
362、 call time
363、 start3:
364、 curse 10,25;光标定位中间
365、 mov cx,200
366、 mov si,0
367、 sclear:
368、 mov number[si],0
369、 add si,2
370、 loop sclear
371、 mov cx,0
372、 mov si,0
373、 mov bx,0
374、 mov crx,25
375、 scroll 1,10,25,10,77,0fh;清除原来等式
376、 ;---开始----
377、 call write
378、 call loopcount
379、 curse cry,crx
380、 call output
381、 mov ah,01
382、 int 21h
383、 scroll 1,cry2,2,cry2,77,0fh;清除原来等式
384、 menu cry2,crx2,number0[2]
385、 inc cry2
386、 cmp cry2,10
387、 jl start2
388、 mov cry2,2
389、 start2:
390、 jmp start1
391、 exit:
392、 mov ah,4ch
393、 int 21h
394、 ;;;;;程序结束
395、 ;====写入函数======
396、 ;数据格式:定义一个DD双字数组,双字的第一个字存数的整数部分,第二个字
397、 ; 存数的小数部分。但是为了最后的输出方便,以及乘法运算的小数
398、 ; 部分运算后向整数部分进位,小数部分采用100进一制
399、 ;存数范围:十进制32512.99~(-32767.00),十六进制7F00.63~8001.00(补码)
400、 ;存数算法:整数部分正数ai=ai*10+a(i+1),负数对正数求补码
401、 ; 小数部分正数bi=b1*10+b2,负数对正数求补码
402、 ;存数说明:采用单个字符一个一个输入的方式,字符为0~9时进入存数算法,当输
403、 ; 入是运算符号时结束存数算法,并且开始存数及存运算符.但是这里要
404、 ; 考虑一个问题不能每次有运算符号进入时都存数,比方A+((X)),如果每
405、 ; 次都存,A就会被存3次.所以这里我们定义了一个常数remb记录每个数存
406、 ; 入情况,方便存数时判断
407、 ;负数处理:负数的介入要求格式为(-X),因为在读取部分,会依次去括号,这样就
408、 ; 变为了-X,所以只需要判断一串公式开头位'-'号,就知道介入的为负
409、 ; 数,再直接对X求补。(注:这步处理放在支持混合运算的si_ze宏部分)
410、 ;小数处理: 通过介入'.'来判断是否开始存入小数部分
411、 ;特别说明: 1:由于运算符号的ASCLL较小,会与介入的数字相等,所以把运算符的
412、 ; ASCLL码加上7F00H在存入,这样也就要把7F00H~7FFFH预留给运算
413、 ; 符号,同时这也会导致存数范围的缩小,不过个人觉得是值的.
414、 ;输入格式: 按照平时正常等式的输入方式输入,以等号结尾.
415、 ; 例如:11*(1-3)/(-3)=
416、 write proc near
417、 ;--写入函数主部分----
418、 startw:
419、 lea dx,number0
420、 mov ah,0ah
421、 int 21h
422、 xor cx,cx
423、 mov cl,number0[1]
424、 mov si,cx
425、 add si,2
426、 mov rsi,si
427、 mov si,0
428、 mov di,2
429、 mov bx,0
430、 startw2:
431、 mov al,number0[di]
432、 inc di
433、 inc crx
434、 mov ah,0
435、 cmp al,45h;'E' 用于程序退出
436、 jz exit
437、 cmp al,2ah;'*'
438、 jz memory;转入存数及存运算符
439、 cmp al,2fh;'/'
440、 jz memory
441、 cmp al,2bh;'/'
442、 jz memory
443、 cmp al,2dh;'-'
444、 jz memory
445、 cmp al,29h;')'
446、 jz memory
447、 cmp al,28h;'('
448、 jz memory
449、 cmp al,2eh;'.'
450、 jz memoryx;转入存入小数程序
451、 cmp al,3dh;'='
452、 jz memory
453、 cmp al,0dh;'CR'
454、 jzendwrite
455、 sub al,30h;为存数算法做准备,让'1'真正变成二进制码的1
456、 cmp al,0
457、 jl error;报错程序
458、 cmp al,9
459、 ja error
460、 cmp memx,2
461、 je error
462、 cmp memx,1
463、 je arithmeticx;小数存数算法程序
464、 jmp arithmetic;整数存数算法程序
465、 ;---memory存入部分---
466、 memory:
467、 cmp memb,0;remb位0时表示数已经数存储过;注:开始为remb赋值时
468、 ;也一定要为0,因为这是为了防止'(1+3)*4'这样直接以运
469、 ;算符开始的等式
470、 je memory1
471、 mov number[si],bx;存入数
472、 cmp memx,1;
473、 je memory2;存小数部分程序
474、 add si,4
475、 gomemory1:
476、 add ax,7f00h;将运算符转换到7F00~7FFF之间
477、 mov number[si],ax;存入运算符
478、 mov memb,0;说明数已经存储过
479、 mov memx,0
480、 mov memcl,0
481、 mov bx,0
482、 add si,4
483、 loop startw2
484、 jmp endwrite
485、 memory1:只存运算符号
486、 add ax,7f00h
487、 mov number[si],ax
488、 add si,4
489、 loop startw2
490、 jmp endwrite
491、 memory2:
492、 add si,2
493、 jmp gomemory1
494、 ;-memoryx小数存入部分-
495、 memoryx:
496、 mov memx,1;当remx为1时表示开始准备小数存入
497、 mov number[si],bx
498、 mov bx,0
499、 add si,2;没有加四,应为这下是要转入存小数的下个字节
500、 loop startw2
501、 jmp endwrite
502、 ;-arithmetic存数算法--
503、 arithmetic:
504、 ;算法bx=bx*10+ax
505、 push ax
506、 mov ax,bx
507、 push cx
508、 mov cx,10
509、 mul cx
510、 pop cx
511、 pop bx
512、 add ax,bx
513、 mov bx,ax
514、 mov memb,1;说明开始存数
515、 cmp bx,7f00h;保证数在合适范围内
516、 jae error
517、 loop startw2
518、 jmp endwrite
519、 ;-arithmeticx存数算法--
520、 arithmeticx:
521、 cmp memcl,1
522、 je arithmetix1
523、 push cx
524、 mov cx,10
525、 mul cx
526、 add bx,ax
527、 pop cx
528、 mov memb,1
529、 inc memcl
530、 loop startw2
531、 jmp endwrite
532、 arithmetix1:
533、 add bx,ax
534、 inc memcl
535、 loop startw2
536、 jmp endwrite
537、 ;---error报错部分----
538、 error:
539、 curse cry,crx
540、 lea dx,error1
541、 mov ah,9
542、 int 21h
543、 jmp start1;重新运行程序
544、 endwrite:
545、 mov di,0
546、 ret
547、 write endp
548、 ;***写入函数结束***
549、 ;===去括号函数=====
550、 ;程序说明:比方'11+(3+99)='这个等式,先从number的首位开始每隔两个字取出数
551、 ; 与')'的现ASCLL码7f29h比较从而找到第一个')'的位置,再到回去找到
552、 ; 最近的'('的位置,从而将中间没括号的等式读出到number3中,接着利
553、 ; 用si_ze函数算出这个等式的值,并且赋值回number中,以替代原来的括
554、 ; 号及括号能的等式
555、 loopcount proc near
556、 startlp:
557、 mov bp,0
558、 mov di,0
559、 mov bx,0
560、 mov si,0
561、 startl:
562、 mov ax,number[si]
563、 cmp ax,7f29h
564、 je rsee
565、 add si,4
566、 cmp ax,7f3dh
567、 je lastl
568、 jmp startl
569、 rsee:
570、 sub si,4
571、 mov ax,number[si]
572、 cmp ax,7f28h
573、 je rwrite
574、 jmp rsee
575、 rwrite:
576、 push si
577、 ; mov lct2,si
578、 mov di,0
579、 add si,2
580、 rwrite1:
581、 add si,2
582、 mov ax,number[si]
583、 mov number2[di],ax
584、 cmp ax,7f29h
585、 je rcount
586、 add di,2
587、 jmp rwrite1
588、 rcount:
589、 push si
590、 ; mov lct1,si
591、 call si_ze
592、 pop ax
593、 pop di
594、 push ax
595、 ; mov di,lct2
596、 mov ax,number3
597、 mov number[di],ax
598、 mov number3,0
599、 mov ax,number3[2]
600、 add di,2
601、 mov number[di],ax
602、 mov number3[2],0
603、 pop si
604、 ; mov si,lct1
605、 add si,2
606、 rcount1:
607、 add si,2
608、 add di,2
609、 mov ax,number[si]
610、 mov number[di],ax
611、 cmp ax,7f3dh
612、 je startlp
613、 jmp rcount1
614、
615、 lastl:
616、 mov si,0
617、 lastll:
618、 mov ax,number[si]
619、 mov number2[si],ax
620、 add si,2
621、 cmp ax,7f3dh
622、 je endl
623、 jmp lastll
624、
625、 endl:
626、 call si_ze
627、 ret
628、 loopcount endp
629、 ;**去括号函数结束**
630、 ;==混合四则运算函数==
631、 ;说明: 通过先不处理加减,先把乘除运算进行,将算出的结果带回原来
632、 ; 的地方取代。最终得到一个只有加减的公式。来方便运算
633、 ;特别说明: 本运算还承贷着将(-1)转为ffffh存入number中,既负数输入
634、 si_ze proc near
635、 mov si,4
636、 mov ax,number2
637、 cmp ax,7f2dh;'-'
638、 jne sstart
639、 give number3,number2[4]
640、 mov fhx,1
641、 change number3,fhx
642、 mov fhx,0
643、 jmp end4ze
644、 sstart:
645、 mov ax,number2[si]
646、 cmp ax,7f2ah;'*'
647、 je mull;计算乘法
648、 cmp ax,7f2fh;'/'
649、 je divv
650、 cmp ax,7f3dh;'='
651、 je sznext;去完乘除后跳转
652、 cmp ax,7f29h;')'
653、 je sznext
654、 add si,4
655、 jmp sstart
656、 mull:
657、 sub si,4
658、 give number3,number2[si]
659、 add si,8
660、 give number4,number2[si]
661、 newmul number3,number4
662、 sub si,8
663、 give number2[si],number3
664、 call sloop
665、 jmp sstart
666、 divv:
667、 sub si,4
668、 give number3,number2[si]
669、 add si,8
670、 give number4,number2[si]
671、 newdiv number3,number4
672、 sub si,8
673、 give number2[si],number3
674、 call sloop
675、 jmp sstart
676、 sznext:
677、 give number3,number2
678、 mov si,0
679、 sznext1:
680、 add si,4
681、 mov ax,number2[si]
682、 cmp ax,7f2bh
683、 je addd
684、 cmp ax,7f2dh
685、 je subb
686、 cmp ax,7f3dh
687、 je end4ze
688、 cmp ax,7f29h
689、 je end4ze
690、 jmp sznext1
691、 addd:
692、 add si,4
693、 give number4,number2[si]
694、 newadd number3,number4
695、 jmp sznext1
696、 subb:
697、 add si,4
698、 give number4,number2[si]
699、 newsub number3,number4
700、 jmp sznext1
701、 end4ze:
702、 RET
703、 si_ze endp
704、 sloop proc near;用于循环赋值
705、 mov di,si
706、 add si,8
707、 sloop1:
708、 add di,4
709、 add si,4
710、 mov ax,number2[si]
711、 push ax
712、 give number2[di],number2[si]
713、 pop ax
714、 cmp ax,7f3dh;等号
715、 je endsloop
716、 cmp ax,7f29h;括号
717、 je endsloop
718、 jmp sloop1
719、 endsloop:
720、 ret
721、 sloop endp
722、 ;**混合四则运算结束**
723、 ;==输出函数==;通过除十取余的方法,将数从低位到高位逐一取出再加30h转为
724、 ; ascll输出。注:先判断数的正负来考虑是否输出符号,接着输出
725、 ; 整数部分再输出一个“.”小数点最后输出小数部分
726、 output proc near
727、 mov si,rsi
728、 judge number3,number4
729、 cmp fhx,1
730、 jne output1
731、 mov number0[si],2dh
732、 inc si
733、 mov dx,2dh
734、 mov ah,02h
735、 int 21h
736、 output1:
737、 mov ax,number3
738、 mov bx,10
739、 mov cx,0
740、 call intoutput
741、 mov number0[si],2eh
742、 inc si
743、 mov dx,2eh;输出小数点
744、 mov ah,02h
745、 int 21h
746、 mov ax,number3[2]
747、 mov bx,10
748、 mov cx,0
749、 call intoutput
750、 mov number0[si],'$'
751、 ret
752、 output endp
753、 intoutput proc near
754、 output2:
755、 mov dx,0
756、 div bx
757、 push dx
758、 inc cx
759、 cmp ax,0
760、 je output3
761、 jmp output2
762、 output3:
763、 pop ax
764、 add ax,30h
765、 mov number0[si],al
766、 inc si
767、 mov dx,ax
768、 mov ah,02
769、 int 21h
770、 loop output3
771、 ret
772、 intoutput endp
773、 ;**输出函数**
774、 CRLF PROC NEAR ;回车、显示功能过程定义,属性为NEAR
775、 MOV DL,0DH ;把回车的ASCII码0DH传给DL
776、 MOV AH,02H ;送DOS 的中断调用功能号
777、 INT 21H ; DOS 的中断调用
778、
779、 MOV DL,0AH ; 把换行的ASCII码0AH传给DL
780、 MOV AH,02H ; 送DOS 的中断调用功能号
781、 INT 21H ; DOS 的中断调用
782、 RET ; 返回
783、 CRLF ENDP ;完成过程定义
784、 TIME PROC NEAR ;显示时间子程序
785、 DISPLAY1:MOV SI,0
786、 MOV BX,100
787、 DIV BL
788、 MOV AH,2CH ;取时间
789、 INT 21H
790、 MOV AL,CH
791、 CALL BCDASC ;将时间数值转换成ASCII码字符
792、 INC SI
793、 MOV AL,CL
794、 CALL BCDASC
795、 INC SI
796、 MOV AL,DH
797、 CALL BCDASC
798、 MOV BP,OFFSET DBUFFER
799、 MOV DX,161dH
800、 MOV CX,8
801、 MOV BX,004EH
802、 MOV AX,1301H
803、 INT 10H
804、 MOV AH,02H
805、 MOV DX,0300H
806、 MOV BH,0
807、 INT 10H
808、 MOV BX,0018H
809、 RE: MOV CX,0FFFFH
810、 REA: LOOP REA
811、 DEC BX
812、 JNZ RE
813、 MOV AH,01H
814、 INT 16H
815、 JE DISPLAY1
816、 JMP start3
817、 RET
818、 TIME ENDP
819、 BCDASC PROC NEAR ;时间数值转换成ASCII码字符子程序
820、 PUSH BX
821、 CBW
822、 MOV BL,10
823、 DIV BL
824、 ADD AL,'0'
825、 MOV DBUFFER[SI],AL
826、 INC SI
827、 ADD AH,'0'
828、 MOV DBUFFER[SI],AH
829、 INC SI
830、 POP BX
831、 RET
832、 BCDASC ENDP
833、 code ends
834、 end start
835、 在汇编器选项中选择编译文件,编译分为五个阶段,生成一系列文件debug 文件list文件symbol文件和执行文件exe文件
836、 执行编译生成的xiaobocalculator.exe,可以看到如下界面显示的作者的个人信息和执行方法press 'E' key to exit press any key to co
837、Xiaobo Welcome you to use the calculator!
838、 data:2014/4/23
839、 ****Designed by 1wangxiaobo@163.com!****
840、 http://hi.baidu.com/yedeqixian
841、 ^Henan University of Economics and Law^
842、press "E" key to exit
843、press any key to contiune
844、Press "Enter" key to introudction
845、按enter继续操作出现如下第一个界面,再enter出现操作界面,下角有时间显示与系统时间同步
846、在这个界面中输入 4344/2= 按enter就会出现答案如下
847、例43.43*44= 3*(4*(13-9))= 78.432/(4.53*(14-9+4-4-4))=
以上就是关于汇编语言程序这篇文章的一些介绍,希望对大家有所帮助。