. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  课程设计一,测试通过  [待解决] 回复[ 0次 ]   点击[ 252次 ]  
wrsg
[帖 主]   [ 发表时间:2019-08-28 15:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-11-21 12:54
assume cs:codesg,ds:datasg

datasg 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 11452,14430,15257,17800   
datasg ends  

data segment
        db 8 dup (0)
data ends

stack segment
        dw 50 dup (0)
stack ends

codesg segment
        start:                        mov     ax,0b800h
                                mov     es,ax
                                mov     dh,0
                                mov     dl,0
                                mov     cl,01110000b
                                mov     cx,80*24                ;循环清屏
                                mov     si,0
                     s0:        mov     byte ptr es:[si],' '
                                mov     byte ptr es:[si].1,0
                                add     si,2
                                loop    s0                              
                                
        
                                mov     ax,datasg
                                mov     es,ax
                                mov     di,0
                                mov     ax,data
                                mov     ds,ax
                                mov     si,0
                                mov     ax,stack
                                mov     ss,ax
                                mov     sp,50                  ;初始化es,ds,ss段
                                
                                
                                mov     cx,21
                                mov     dh,4 
                                mov     bx,0
                                
                                
                                
                      s1:       push    cx
                                mov     ax,es:[di].0
                                mov     ds:[si].0,ax
                                mov     ax,es:[di].2
                                mov     ds:[si].2,ax
                                mov     byte ptr ds:[si].4,0     ;将es段得数据转移到ds:si内,调用show_str显示
                                
                                mov     dl,5
                                mov     cl,7
                                call    show_str                ;显示年份
                                
                                
                                mov     ax,es:[di].84
                                push    dx                      ;保存 行dh值 不被改变
                                mov     dx,es:[di].86
                                call    dtoc_dword
                                pop     dx                               
                                mov     dl,15
                                mov     cl,7
                                call    show_str                ;显示收入                                

                                mov     ax,es:[bx].168
                                call    dtoc_word                                
                                mov     dl,30
                                mov     cl,7
                                call    show_str                ;显示人数
                                
                                
                                mov     ax,es:[di].84
                                push    dx
                                mov     dx,es:[di].86
                                div     word ptr es:[bx].168
                                call    dtoc_word
                                pop     dx
                                mov     dl,40
                                mov     cl,7
                                call    show_str
                                
                                inc     dh
                                add     di,4
                                add     bx,2
                                pop     cx
                                loop    s1           
                                
                                mov         ax,4c00h
                                int        21h
                                
        ;name:                dtoc_word
        ;function:        将word(16)型数据转变为十进制数的字符串,字符串以0为结尾符
        ;parameter:        16位数据ax,  ds:si指向字符串的首地址
        ;return:        存储结果在 ds:si
        dtoc_word:                push    ax
                                push        bx
                                push        cx
                                push        dx
                                push        di
                                push        si
                                push    es
                                
                                mov                 si,0                ;初始化ds:si
                                mov                di,0                ;使用di计数
          dtoc_s0:                mov                 dx,0
                                mov                 bx,10d
                                div                bx                        ;(dx,ax)/bx=ax....dx
                                add                dx,'0'                ;转变为十进制字符串
                                push                dx                ;入栈暂存
                                inc                di                ;计数+1
                                mov                cx,ax
                                jcxz                dtoc_s1                ;若除法结果ax为0,跳出循环
                                jmp                dtoc_s0
                                
          dtoc_s1:                mov                 cx,di
          dtoc_s2:                pop                ax
                                mov                ds:[si],ax         
                                inc                si
                                loop                dtoc_s2
                                mov                 byte ptr ds:[si],0
                                
                                pop     es
                                pop         si
                                pop         di
                                pop     dx
                                pop         cx
                                pop         bx
                                pop         ax
                                ret
        

        ;name:                dtoc_dword
        ;function:        将dword(32)型数据转变为十进制数的字符串,字符串以0为结尾符
        ;parameter:        32位数据dx,ax,  ds:si指向字符串的首地址
        ;return:        存储结果在 ds:si
        dtoc_dword:                push    ax
                                push        bx
                                push        cx
                                push        dx
                                push        di
                                push        si

                                        
                                mov                si,0                ;初始化ds:si
                                mov                di,0
                dd_s0:                mov                cx,dx
                                jcxz                dd_s1
                                
                                mov                cx,10d
                                call                divdw                ;divdw: (dx,ax)/cx=(dx,ax)...cx
                                add                cx,'0'                ;将余数转为十进制字符
                                push            cx                ;入栈暂存
                                inc             di                ;计数+1
                                jmp                 dd_s0
                
                dd_s1:        mov         dx,0
                                mov                 bx,10d
                                div                bx                ;(dx,ax)/bx=ax....dx
                                add                dx,'0'                ;转变为十进制字符串
                                push                dx                ;入栈暂存
                                inc                di                ;计数+1
                                mov                cx,ax
                                jcxz                dd_s2                ;若除法结果ax为0,跳出循环
                                jmp                dd_s1
                                
          dd_s2:                mov                 cx,di
          dd_s3:                pop                ax
                                mov                ds:[si],ax         
                                inc                si
                                loop                dd_s3
                                mov                 byte ptr ds:[si],0
                        
                                pop         si
                                pop         di
                                pop     dx
                                pop         cx
                                pop         bx
                                pop         ax
                                ret

        ;name:                divdw
        ;function:        被除数高16位dx,低16位ax,除数cx
        ;return:        结果高16位dx,低16位ax,余数cx
        divdw:                        push        bx                
                                push        ax                        ;储存低位
                                mov                ax,dx
                                mov                dx,0
                                div                 cx                ;先计算高16位除法,(dx,ax)/cx=ax.....dx
                                mov                bx,ax                ;把高位除法结果暂存bx
                                
                                pop                ax
                                div                cx                ;计算低16位除法,(dx,ax)/cx=ax.....dx
                                
                                mov                cx,dx                ;返回余数cx
                                mov                dx,bx                ;返回高16位dx,低16位ax
                                
                                pop         bx                                
                                ret
        
        ;name:                show_str
        ;function:        行dh,列dl,颜色cl, ds:si指向字符串的首地址
        ;return:        0
        show_str:                push    ax
                                push        bx
                                push        cx
                                push        dx
                                push        di
                                push        si
                                push    es
                                
                                mov         ax,0b800h
                                mov         es,ax                ;显示屏段起始地址
                                
                                mov         bl,cl                ;暂存颜色
                                mov        al,160
                                mul         dh                ;8位乘法al*dh,结果储存在ax
                                mov         dh,0
                                add        dl,dl                ;dh,dl合成dx,dl列
                                add         ax,dx
                                mov         di,ax                ;es:di为显示屏当前位置
                                mov        ah,bl                ;字体颜色
        
          show_s0:        mov         ch,0
                                mov         cl,ds:[si]
                                jcxz         show_s1
                                
                                mov         al,ds:[si]
                                mov         es:[di],ax
                                inc        si
                                add         di,2
                                jmp         short show_s0
          
          show_s1:                pop     es
                                pop         si
                                pop         di
                                pop     dx
                                pop         cx
                                pop         bx
                                pop         ax
                                ret

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