汇编网首页登录博客注册
yang5731的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
友情链接

[2010-08-25 02:44] 课程设计1

图片载入中
;思路:要把DATA中的双字节数字转换成十进制的字符串,所占内存不等,直接转换肯定不行,
;我就新定义了一个TABLE段,把DATA段、STACK段中的数据转换成所占内存相等的字符串存进来,
;再将TABLE段中的数据显示出来
assume cs:code
data segment          
        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 
stack 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' 
stack ends

table segment
        dd 84 dup (0,0,0,0,0,0,0,0)        
table ends
code segment
start:                mov ax,stack
                mov ss,ax
                mov sp,0
                mov ax,table
                mov es,ax
                mov bx,0
                mov si,0
                mov di,0
                mov cx,21
        nf:        pop es:[si]                ;NF 为年份
                pop es:[si+2]
                add si,8
                loop nf

                mov bx,si
                mov ax,data
                mov ds,ax
                sub si,si
                mov cx,21
        sr:        mov ax,[si]                ;RS为收入
                mov dx,[si+2]
                
                call dtoc
                add si,4
                add bx,8
                loop sr
                
                mov cx,21
        rs:        mov ax,[si]                ;RS 为人数
                mov dx,0
                call dtoc
                add si,2
                add bx,8
                loop rs
                
                sub si,si
                add di,84
                mov cx,21
        rj:        push cx                        ;RJ为人均收入
                mov ax,[si]
                mov dx,[si+2]
                
                mov cx,[di]
                call divdw                
                call dtoc
                add si,4
                add di,2
                add bx,8
                pop cx
                loop rj

                mov ax,table
                mov ds,ax
                mov dh,3
                mov dl,3
                
                mov si,0
                mov cx,4
        xs:        call show_str
                add dl,20
                loop xs
                
                mov ax,4c00h
                int 21h

;子程序DTOC功能:将DATA段中的一个DWORD数据转换成十进制的字符串,
;参数:AX=DWORD数据的低16位,DX=DWORD数据的高16位
dtoc:                   push si 
                push bx
                push cx
                push di
                push bp

        
                mov di,0ah         ;转换成几进制就除几
                mov si,0         
                mov cx,di        ;这里CX只要不得1就行
        
        s1:        push ax
                mov ax,dx 
                mov dx,0
                div di         
                        mov bp,ax ;保存高16位的商
                pop ax
                div di
                add dx,30h        
                push dx
                mov dx,bp         
                inc si                 ;这里用SI计算循环次数,这个循环得到十进制字符串,不过是倒着排列的                        
                mov cx,ax
                inc cx         ;这CX+1主要是让CX=1时不触发跳转      本来是用MUL CX的 但是会改变DX的值, 
                jcxz s2         
                loop s1         ;CX-1

        s2:          mov cx,si
                sub si,si 

        s3:          pop dx                    ;将十进制字符串顺过来                    
                mov es:[si+bx],dl         ;这里ES指向TABKE
                inc si 
                loop s3 
                pop bp
                pop di
                pop cx
                pop bx
                pop si 
        ret 
;子程序DIVDW功能:不会产生溢出的除法运算
;参数:AX=AX=DWORD数据的低16位,DX=DWORD数据的高16位,CX=除数
;返回:AX=商低16位,DX=商的高16位,CX=余数
divdw:          push bx
                push di
                push bp
                
                mov di,ax
                mov ax,dx                  
                mov dx,0         
                div cx 
                mov bp,ax 
                mov ax,di
         
                div cx 
                mov cx,dx 
                mov dx,bp 
                pop bp
                pop di
                pop bx

        ret 
;子程序SHOW_STR功能:在屏幕中显示21行,每行8个字符串
;参数:DH=行数,DL=列数,
show_str:       push ax
                push dx 
                push cx                               
                mov ax,0b800h 
                mov es,ax 
                mov cl,2             ;这里CL为颜色,本来放主程序的,但是主程序也要用到,不好保存就写进子程序了                            
                mov ax,2
                mul dl
                
                mov bx,ax
                sub bx,2
                mov ax,0a0h 
                sub dh,1
                mul dh                                 
                add bx,ax 
                mov ah,cl
                mov di,0 
                mov cx,21      ;输出21行
        s:        push cx
                mov di,0
                mov cx,8         ;循环输出8个字符
       a:       mov al,ds:[si]
                                
                mov es:[bx+di],ax 
                inc si 
                add di,2                                
                loop a
                
                pop cx
                add bx,0a0h        ;换行
                loop s
                pop cx
                pop dx
                pop ax                                   
                ret  

                mov ax,4c00h
                int 21h
code ends
end start
评论次数(0)  |  浏览次数(441)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码