8086汇编语言课程设计一

来源:互联网 发布:exp数据库表结构导出 编辑:程序博客网 时间:2024/06/08 14:53

最近自学了王爽的《汇编语言》,全书共有两次课程设计,这是第一个:

给定数据如下

data segment       db '1975','1976','1977','1978','1979','1980','1981','1982','1983'       db '1984','1985','1986','1987','1988','1989','1990','1991','1992'       db '1993','1994','1995'       ;以上是表示21年的21个字符串             dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514       dd 245980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000       ;以上是表示21年公司总收入的21个dword型数据             dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226       dw 11542,14430,15257,17800       ;以上是表示21年公司雇员人数的21个word型数据data ends

将其格式化显示至屏幕,并计算收入和雇员人数相除的商然后后显示到屏幕上。

格式如下:

1975 163 16/3······1995 5937000178005937000/17800


问题很简单,但是实现过程中有一些细节需要注意

首先,需要单独实现三个功能,分别为:数据转换dtoc,dword不会产生溢出的除法运算divdw,显示字符串show_str

实现这些子功能时要注意将冲突的寄存器内的值记录在栈里,

然后将这些子功能组合,实现整个程序,代码如下:

assume ds:data,cs:code,ss:stackdata segmentdb '1975','1976','1977','1978','1979','1980','1981','1982'db '1983','1984','1985','1986','1987','1988','1989','1990'db '1991','1992','1993','1994','1995' dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226,11542,14430,15257,17800 db 16 dup(0)data endsstack segmentdb 48 dup(0)stack endscode segmentstart:mov ax,datamov ds,axmov ax,stackmov ss,axmov sp,30hmov si,0   ;data段偏移地址mov bp,168 ;人数第一个数据地址mov dh,1   ;显示行号mov dl,20  ;显示列号mov cx,21 show1:push cxmov cx,4   ;循环4次显示年份  s:push cxmov cl,00001010bmov al,[si]call DispALinc siinc dlpop cxloop sadd dl,5mov di,dxmov ax,ds:[si].80  ;转换收入数据mov dx,ds:[si].82push simov si,21*10call dtocmov dx,dimov cl,00001010b   ;显示收入数据call show_stradd dl,9mov di,dxmov ax,ds:[bp]     ;转换人数数据mov dx,0call dtocmov dx,dimov cl,00001010b   ;显示收入数据call show_stradd dl,9mov di,dxpop simov ax,ds:[si].80mov dx,ds:[si].82  ;计算平均收入mov cx,ds:[bp]push sicall divdwmov si,21*10   ;转换call dtocmov dx,dimov cl,00001010bcall show_str     ;显示inc dhmov dl,20add bp,2pop sipop cxloop show1mov ax,4c00hint 21h;显示al中的字符;al:字符ASCLL码,cl:字符颜色,dh:行号,dl:列号;返回值:无DispAL:push sipush dxpush cxpush axpush bxmov bx,0B800hmov es,bx mov si,axmov al,160 mul dh   ;计算行地址mov bx,axmov al,2mul dladd bx,axmov ax,simov es:[bx],almov es:[bx].1,clpop bxpop axpop cxpop dxpop siret;显示ds:[si]中的字符串;ds:[si]:字符串首地址,cl:字符颜色,dh:行号,dl:列号;返回值:无show_str:push sipush dxpush cxpush axpush bxpush simov ax,0B800hmov es,ax mov al,160 mul dh   ;计算行地址mov bx,axmov al,2mul dladd bx,axmov dl,clshow:mov cl,ds:[si]mov ch,0jcxz okmov es:[bx],clinc bxmov es:[bx],dlinc bxinc sijmp short showok:pop sipop bxpop axpop cxpop dxpop siret ;将dword数据转换为字符串;ds:[si]:字符串首地址,dx,ax:数字的高位和低位;返回值:无dtoc:push dipush bxpush sipush dxpush axpush cxmov di,0push dimov di,1mov cx,10 a:call divdwadd cx,30hpush cxinc dimov cx,dxadd cx,axjcxz writemov cx,10jmp a write:mov cx,di b:pop bxmov [si],blinc siloop bpop cxpop axpop dxpop sipop bxpop diret;进行不会产生溢出的除法运算;dx,ax:数字的高位和低位,cx:除数;返回值:结果的高位和低位,cx:余数divdw:push sipush dimov si,axmov ax,dxmov dx,0div cxmov di,axmov ax,sidiv cxmov cx,dxmov dx,dipop dipop siretcode endsend start



1 0
原创粉丝点击