. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  课程设计1 程序测试通过!  [待解决] 回复[ 2次 ]   点击[ 425次 ]  
donggs02
[帖 主]   [ 发表时间:2010-11-25 10:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-04-08 17:43
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 21 dup ('year summ ne ?? ') 
table ends 
huancun segment
        dd 8 dup (0)
huancun ends
codesg segment 
start:  mov ax,data 
        mov ds,ax 
        mov ax,table 
        mov es,ax 
        mov bx,0         
        mov si,0 
        mov di,0 
        mov cx,21 
r:      mov ax,ds:[bx] 
        mov dx,ds:[bx+2] 
        mov es:[di],ax 
        mov es:[di+2],dx 
        mov ax,ds:[bx+84] 
        mov dx,ds:[bx+86] 
        mov es:[di+5],ax 
        mov es:[di+7],dx 
        div word ptr ds:[si+168] 
        mov es:[di+13],ax 
        mov ax,ds:[si+168] 
        mov es:[di+10],ax 
        add bx,4 
        add si,2 
        add di,16 
        loop r 
        sub si,si
        mov ax,0B800H
        mov ds,ax
        sub ax,ax
        mov ah,15
        mov cx,2000
p:        mov [si],ax
        add si,2
        loop p
        sub bx,bx
        sub si,si
        sub di,di
        mov ax,huancun
        mov ds,ax
        mov ax,table
        mov es,ax
        mov bh,3
        mov bl,3
        mov cx,21
z:        push cx
        mov ax,es:[di]
        mov dx,es:[di+2]
        mov ds:[0],ax
        mov ds:[2],dx
        mov byte ptr ds:[4],0
        mov dh,bh 
        mov dl,bl
        mov cl,15 
        mov si,0 
        call show_str 
        mov ax,es:[di+5]
        mov dx,es:[di+7]
        mov ds:[16],ax
        mov ds:[18],dx
        mov ax,es:[di+10]
        sub dx,dx
        mov ds:[20],ax
        mov ds:[22],dx
        mov ax,es:[di+13]
        mov ds:[24],ax
        mov ds:[26],dx
        push bx
        push di
        mov di,16
        mov cx,3
z1:        push cx
        add bl,10
        mov ax,ds:[di]
        mov dx,ds:[di+2] 
        mov cx,0AH 
        call divdw 
        mov dh,bh 
        mov dl,bl
        mov cl,15 
        mov si,0 
        call show_str
        add di,4
        pop cx
        loop z1
        pop di
        pop bx
        inc bh
        add di,16
        pop cx
        loop z
        mov ax,4c00H
        int 21H

divdw:  push ax
        push bx
        push cx
        push dx
        push si 
        push di
        sub di,di
d:      mov bx,ax 
        mov ax,dx 
        sub dx,dx 
        div cx 
        mov si,ax 
        mov ax,bx 
        div cx 
        push dx 
        inc di
        mov dx,si 
        push cx
        mov cx,ax
        jcxz d1
        pop cx
        jmp short d
d1:        pop cx
        mov cx,di
        sub si,si
d2:        pop bx
        add bl,30H
        mov byte ptr [si],bl
        inc si
        loop d2
        mov byte ptr [si],0
        pop di        
        pop si 
        pop dx 
        pop cx
        pop bx
        pop ax
        ret         
        

show_str: 
        push dx 
        push cx 
        push ax 
        push si 
        push es 
        push bx 
        mov ax,0b800H 
        mov es,ax 
        mov al,160 
        dec dh 
        mul dh 
        sub dh,dh 
        dec dl 
        add dl,dl 
        add ax,dx 
        mov bx,ax 
        mov dl,cl 
s:      mov ch,0 
        mov cl,[si] 
        jcxz s1 
        mov ch,dl 
        mov es:[bx],cx 
        inc si 
        add bx,2 
        jmp short s 
s1:     pop bx 
        pop es 
        pop si 
        pop ax 
        pop cx 
        pop dx 
        ret 

codesg ends 
end start 

多多交流
donggs02
[第1楼]   [ 回复时间:2010-11-25 21:43 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-04-08 17:43
简单注解:
    程序的目的是把日期 收入 员工 人均收入 按一定的格式显示在屏幕上,本程序为了简洁没有设置栈(栈用系统栈空间)。
 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 21 dup ('year summ ne ?? ')  
table ends  
huancun segment 
        dd 8 dup (0) 
huancun ends 
codesg segment  
start:  mov ax,data  
        mov ds,ax  
        mov ax,table  
        mov es,ax  
        mov bx,0          
        mov si,0  
        mov di,0  
        mov cx,21  
r:      mov ax,ds:[bx]  
        mov dx,ds:[bx+2]  
        mov es:[di],ax  
        mov es:[di+2],dx  
        mov ax,ds:[bx+84]  
        mov dx,ds:[bx+86]  
        mov es:[di+5],ax  
        mov es:[di+7],dx  
        div word ptr ds:[si+168]  
        mov es:[di+13],ax  
        mov ax,ds:[si+168]  
        mov es:[di+10],ax  
        add bx,4  
        add si,2  
        add di,16  
        loop r  
      这段程序是把 日期 收入 员工 人均收入 计算好后存储在预设的空间,直接用我实验7写的程序。
----------------------------------------------------------------------------------


         sub si,si 
        mov ax,0B800H 
        mov ds,ax 
        sub ax,ax 
        mov ah,15 
        mov cx,2000 
p:        mov [si],ax 
        add si,2 
        loop p 
      这段是清屏,  把整个屏幕变成黑色。
----------------------------------------------------------------------

        sub bx,bx 
        sub si,si 
        sub di,di 
        mov ax,huancun 
        mov ds,ax 
        mov ax,table 
        mov es,ax 
        mov bh,3 
        mov bl,3 
        mov cx,21 
z:        push cx 
        mov ax,es:[di] 
        mov dx,es:[di+2] 
        mov ds:[0],ax 
        mov ds:[2],dx 
        mov byte ptr ds:[4],0 
        mov dh,bh  
        mov dl,bl 
        mov cl,15  
        mov si,0  
        call show_str  
        mov ax,es:[di+5] 
        mov dx,es:[di+7] 
        mov ds:[16],ax 
        mov ds:[18],dx 
        mov ax,es:[di+10] 
        sub dx,dx 
        mov ds:[20],ax 
        mov ds:[22],dx 
        mov ax,es:[di+13] 
        mov ds:[24],ax 
        mov ds:[26],dx 
        push bx 
        push di 
        mov di,16 
        mov cx,3 
z1:        push cx 
        add bl,10 
        mov ax,ds:[di] 
        mov dx,ds:[di+2]  
        mov cx,0AH  
        call divdw  
        mov dh,bh  
        mov dl,bl 
        mov cl,15  
        mov si,0  
        call show_str 
        add di,4 
        pop cx 
        loop z1 
        pop di 
        pop bx 
        inc bh 
        add di,16 
        pop cx 
        loop z 
        mov ax,4c00H 
        int 21H 

  这段是主程序,关键是对子程序的重复调用,注意子程序的入口的数据设置。
---------------------------------------------------------------------

divdw:  push ax 
        push bx 
        push cx 
        push dx 
        push si  
        push di 
        sub di,di 
d:      mov bx,ax  
        mov ax,dx  
        sub dx,dx  
        div cx  
        mov si,ax  
        mov ax,bx  
        div cx  
        push dx  
        inc di 
        mov dx,si  
        push cx 
        mov cx,ax 
        jcxz d1 
        pop cx 
        jmp short d 
d1:        pop cx 
        mov cx,di 
        sub si,si 
d2:        pop bx 
        add bl,30H 
        mov byte ptr [si],bl 
        inc si 
        loop d2 
        mov byte ptr [si],0 
        pop di         
        pop si  
        pop dx  
        pop cx 
        pop bx 
        pop ax 
        ret          
  子程序,目的是16进制转换成10进制后在加30H转变成ASCII码后存储在指定的位置后在后面加一个零。
---------------------------------------------------------------------------------

 show_str:  
        push dx  
        push cx  
        push ax  
        push si  
        push es  
        push bx  
        mov ax,0b800H  
        mov es,ax  
        mov al,160  
        dec dh  
        mul dh  
        sub dh,dh  
        dec dl  
        add dl,dl  
        add ax,dx  
        mov bx,ax  
        mov dl,cl  
s:      mov ch,0  
        mov cl,[si]  
        jcxz s1  
        mov ch,dl  
        mov es:[bx],cx  
        inc si  
        add bx,2  
        jmp short s  
s1:     pop bx  
        pop es  
        pop si  
        pop ax  
        pop cx  
        pop dx  
        ret  

      子程序:入口dh列dl行cl色目的把ds指定的数据显示在指定的位置,数据后加零程序遇零结束。
--------------------------------------------------------------------------------
  大家看一下还有优化的地方不 ,多多交流
515332695
[第2楼]   [ 回复时间:2010-11-27 14:32 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-06-01 22:23
assume cs:code,es:table,ss:stack

data segment 
db '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
dd 50065,97479,140417,197514,345980,590827,803530,1183000
dd 1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220
dw 476,778,1001,1442,2258,2793,4037,5635
dw 8226,11542,14430,15257,17800
data ends

table segment
db 21 dup ('year summ ne ?? ')
table ends

stack segment
db 32 dup(0)
stack ends

mid segment
db 32 dup(0)
mid ends


code segment
  start:mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        mov ax,stack
        mov ss,ax
        mov sp,32

        mov bx,0
        mov si,0
        mov di,0
        mov cx,21

     s0:push ds:[si]
        pop es:[bx]
        push ds:[si+2h]
        pop es:[bx+2h]
        mov byte ptr es:[bx+4h],0

        mov ax,ds:[si+54h]
        mov es:[bx+5h],ax
        mov dx,ds:[si+56h]
        mov es:[bx+7h],dx

        push ds:[di+0a8h]
        pop es:[bx+0ah]

        div word ptr es:[bx+0ah]
        mov es:[bx+0dh],ax

        add si,4
        add di,2
        add bx,16
        loop s0                         ;制成表格



time:   mov ax,0
        mov bx,0
        mov cx,0
        mov dx,0
        mov ds,ax
        mov es,ax
        mov ax,table
        mov ds,ax
        mov ax,stack
        mov ss,ax
        mov sp,32
        mov si,0
        mov di,0
        mov cx,21
        mov dh,3
   year:mov dl,3
        push cx
        mov cl,7
        call show_str
        add si,16
        inc dh
        pop cx
        loop year                       ;年份显示




money:  mov ax,0
        mov bx,0
        mov cx,21
        mov dx,0
        mov si,0
        mov di,5
        mov ax,mid
        mov ds,ax
        mov ax,table
        mov es,ax
        mov dh,3
   summ:mov dl,15
        push cx
        push dx
        mov ax,es:[di]
        mov dx,es:[di+2]
        call dtoc
        pop dx
        mov cl,7
        call show_str
        inc dh
        add di,16
        pop cx
        loop summ                       ;总收入显示

people: mov bx,0
        mov cx,21
        mov dx,0
        mov si,0
        mov di,0ah
        mov ax,mid
        mov ds,ax
        mov ax,table
        mov es,ax
        mov dh,3
    num:mov dl,30
        push cx
        push dx
        mov ax,es:[di]
        mov dx,0
        call dtoc
        pop dx
        mov cl,7
        call show_str
        inc dh
        add di,16
        pop cx
        loop num                        ;人数显示

average:mov bx,0
        mov cx,21
        mov dx,0
        mov si,0
        mov di,0dh
        mov ax,mid
        mov ds,ax
        mov ax,table
        mov es,ax
        mov dh,3
   aver:mov dl,45
        push cx
        push dx
        mov ax,es:[di]
        mov dx,0
        call dtoc
        pop dx
        mov cl,7
        call show_str
        inc dh
        add di,16
        pop cx
        loop aver                       ;平均收入显示

        mov ax,4c00h
        int 21h

show_str:                               ;功能:在指定位置,用指定颜色,显示一个用0结束的字符串
                                        ;参数:dh=行号,dl=列号,cl=颜色,ds:si指向字符串首地址
                                         ;返回:无
        push ax
        push bx
        push cx
        push dx
        push es
        push si
        push di

        mov ax,0b800h
        mov es,ax
        dec dh
        dec dl
        add dl,dl
        mov ah,0
        mov al,0a0h
        mul dh
        mov dh,0
        add ax,dx
        mov bx,ax
        mov dl,cl

show_str1:

        mov cl,ds:[si]
        mov ch,0
        jcxz returnshow_str
        mov ch,dl
        mov es:[bx],cx
        inc si
        add bx,2
        jmp show_str1

returnshow_str:

        pop di
        pop si
        pop es
        pop dx
        pop cx
        pop bx
        pop ax
        ret

dtoc:                                   ;功能:将dword型数据转换成十进制字符串,以0为结束符
                                        ;参数:ax=dd低16位,dx=dd高16位,ds:si指向转换后字符串首地址
                                        ;返回:无
        push ax
        push bx
        push cx
        push dx
        push es
        push si

dtoc_1:
        mov cx,0ah
        call divdw
        add cx,30h
        push cx
        mov cx,dx
        jcxz dtoc_2
dtoc_2:
        mov cx,ax
        jcxz dtoc_3
        jmp dtoc_1
dtoc_3:
        mov si,0
dtoc_4:
        pop ds:[si]
        mov cx,[si]
        mov ch,0
        jcxz returndtoc
        inc si
        jmp dtoc_4
returndtoc:
        mov si,0
        pop es
        pop dx
        pop cx
        pop bx
        pop ax
        ret        

divdw:                                  ;功能:进行不产生溢出的除法
                                        ;参数:ax=dd低16位,dx=dd高16位,cx=除数
                                        ;返回:ax=结果低16位,dx=结果高16位,cx=余数
        push bx
        push ax
        mov ax,dx
        mov dx,0
        div cx
        mov bx,ax
        pop ax
        div cx
        mov cx,dx
        mov dx,bx
        pop bx
        ret

code ends
end start
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved