. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  课程设计1,大功告成!   欢迎同仁们共同学习指教,这个却实有够费事的……  [待解决] 回复[ 3次 ]   点击[ 454次 ]  
tianyanly1984
[帖 主]   [ 发表时间:2009-02-22 22:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2008-12-12 00:18
assume cs:codesg  
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'  

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514  
dd 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  
dw 11542,14430,15257,17800  
data ends                 //原公司数据 

table segment  
db 16 dup(0)  
table ends  //定义16字节数据空间用于暂存对公司数据的相关转换 

codesg segment   
start:mov ax,data   
mov es,ax     //设原数据在es段           
mov ax,table   
mov ds,ax     //设转换为要显示在屏幕上的数据的空间为数据段 
mov dh,3 
mov dl,10     //初始化在3行10列显示第一个数据 
mov di,0      //读取双字单元数据的变址 
mov si,0      //要显示的数据偏移地址的首地址 
mov bp,0      //读取字单元数据的变址 
call clear    //调用清屏子程序,先清空屏幕 

mov cx,21     //程序下面将循环21次,每次显示公司一条记录 
main:push cx 
mov cl,       //显示在屏幕上字符的颜色 
mov ax,es:[di] 
mov ds:[0],ax 
mov ax,es:2[di] 
mov ds:[2],ax 
call show_str    //以上实现年份的字段的显示 
add dl,15       //列数增加15,拉开距离,以便显示下一字段 

push dx 
mov ax,es:84[di] 
mov dx,es:86[di] 
call dtoc 
pop dx 
call show_str   //以上实现总收入字段的显示 
add dl,15       //同上,改变列的显示位置 

push dx 
mov ax,es:168[bp] 
mov dx,0 
call dtoc 
pop dx 
call show_str   //以上实现雇员数字段的显示 
add dl,15      //同上,改变列的显示位置 

push dx 
mov ax,es:84[di] 
mov dx,es:86[di] 
mov bx,es:168[bp] 
div bx 
mov dx,0 
call dtoc 
pop dx 
call show_str    //以上实现人平收入字段的显示 

add bp,2 
add di,4 
inc dh         //行数加1,实现换行准备显示下一条记录 
mov dl,10    //重设列数为10,准备显示下一条记录,并对齐上一条 
pop cx 
loop main    //返回main,去显示下一条记录 

mov ax,4c00h   
int 21h   

dtoc:push ax   //以下是双字型转十进制字符串的子程序 
push bx 
push cx 
push dx 
push si 
push di 
mov bx,0 
push bx 
mov di,1 
s:mov cx,10 
call divdw 
mov bx,cx 
mov cx,ax 
add bl,30h 
push bx 
inc di 
jcxz oka 
jmp short s 
oka:mov cx,dx 
jcxz ok 
jmp short s 
ok:mov cx,di 
oo:pop [si] 
inc si 
loop oo 
pop di 
pop si 
pop dx 
pop cx 
pop bx 
pop ax 
ret 

show_str:push ax     //以下是字符串显示的子程序 
push bx 
push cx 
push dx 
push es 
push si 
mov ax,0b800h 
mov es,ax 
mov al,160 
mul dh 
mov bx,ax 
mov al,2 
mul dl 
add bx,ax 
mov ch,0 
s1:push cx 
mov cl,[si] 
jcxz ok1 
mov es:[bx],cl 
pop cx 
mov es:[bx+1],cl 
inc si 
add bx,2 
jmp short s1 
ok1:pop cx 
pop si 
pop es 
pop dx 
pop cx 
pop bx 
pop ax 
ret 

divdw:push bx   //以下是防除法溢出子程序 
mov bx,ax 
mov ax,dx 
mov dx,0 
div cx 
push ax 
mov ax,bx 
div cx 
mov cx,dx 
pop dx 
pop bx 
ret 

clear:push ax    //以下是清空屏幕的子程序 
push es 
push bx 
push cx 
mov ax,0b800h 
mov es,ax 
mov bx,0 
mov cx,2000 
cls:mov word ptr es:[bx],0720h 
add bx,2 
loop cls 
pop cx 
pop bx 
pop es 
pop ax 
ret 

codesg ends    //代码结束 
end start      //OK!大功告成...
tianyanly1984
[第1楼]   [ 回复时间:2009-02-22 22:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2008-12-12 00:18
" mov cl,       //显示在屏幕上字符的颜色 "

不好意思,这里应该是mov cl,2       //显示在屏幕上字符的颜色   ,不小心抹掉了!!!这儿设为绿色的
abob
[第2楼]   [ 回复时间:2009-02-26 16:48 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
楼主继续加油啊~

我觉得能做出来就是一大胜利,至于代码的精简可以以后在做~
aten
[第3楼]   [ 回复时间:2009-04-05 00:15 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2008-12-11 08:43
呵呵,学习了!
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved