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

我的博客

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

[2011-09-03 19:17] 程序设计一程序有没有错误的地方呀大家检查检查

图片载入中
assume cs:code
date 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,2391,81111,161111,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
date ends
temp segment
  db 16 dup (0)
temp ends
stack segment
  db 160 dup (0)
stack ends
code segment
start:
        mov ax,stack
        mov ss,ax
        mov sp,160
        mov ax,date
        mov es,ax
        mov bp,0
        mov ax,temp
        mov ds,ax
        mov si,0
        mov cx,21
        mov dh,3
;***************************************************显示年份
year:        
        inc dh
        push dx
        mov ax,es:[bp]
        mov dx,es:[bp+2]
        mov ds:[si],ax
        mov ds:[si+2],dx
        mov byte ptr ds:[si+4],0
        pop dx
        push cx
        mov dl,08h
        mov cl,2
        call show_str
        add bp,4
        pop cx
loop year
;************************************************************显示总收入
        mov si,0
        mov cx,21
        mov dl,20
        mov dh,4

gent:
        push cx
        push dx
        mov ax,es:[bp]
        mov dx,es:[bp+2]
        call dwtoc
        add bp,4
        pop dx
        mov cl,2
        call show_str
        inc dh
        pop cx
loop gent
;**************************************************************显示人数
        mov si,0
        mov cx,21
        mov dl,35
        mov dh,4
num:
        push cx
        push dx
        mov ax,es:[bp]
        call wtoc
        add bp,2
        pop dx
        mov cl,2
        call show_str
        inc dh
        pop cx
loop num
;*******************************************************************显示平均收入
        mov bp,0
        mov cx,21
        mov si,0
        mov dl,45
        mov dh,4
aver:
        push cx
        push dx
        mov ax,es:[bp+84]
        mov dx,es:[bp+86]
        mov cx,es:[bx+168]
        call divdw
        call dwtoc
        add bp,4
        add bx,2
        pop dx
        mov cl,2
        call show_str
        inc dh
        pop cx
loop aver
        
        mov ax,4c00h
        int 21h
;*******************************************************************************子函数
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示以0结尾的字符串
;参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串的首地址
;返回:无
show_str:        
                push ax
                push es
                push bp
                push dx
                push cx
                push si                                ;保存相关寄存器
                mov ax,0b800h
                mov es,ax
                mov ax,160
                mul dh
                mov dh,0
                add ax,dx
                add ax,dx        
                mov bp,ax                        ;设置字符串在显存的初始偏移地址es:bp
                mov ah,cl
show_str_copy:                
                mov al,ds:[si]
                mov cl,al
                mov ch,0
                jcxz show_str_retur
                mov es:[bp],ax
                add bp,2
                inc si
        jmp short show_str_copy                        ;将ds:si中的字符串复制到es:bp对应的显存中,复制以0为结束标志
show_str_retur:                
                pop si
                pop cx
                pop dx
                pop bp
                pop es
                pop ax
                ret
;***************************************************************************子函数
;名称:dwtoc
;功能:将dword型数据转换成ascii码十进制的字符串,字符串末尾以0结束
;参数:dx=dword高16位,ax=dword低16位,ds:si指向字符串首地址
;返回:无
dwtoc:        
                push dx                       
                push ax
                push cx
                push si
                push di
                push bx
                push bp
                mov bp,0                         ;保存相关寄存器,设置bp为计数寄存器
  dwtoc_s1:        
                mov cx,10
                mov di,dx
                mov bx,ax
                mov ax,dx
                mov dx,0
                div cx                                ;ax=商,dx=余数
                mov di,ax                        ;int(H/N)=di
                mov ax,bx
                div cx                                ;ax=商,dx=余数
                mov cx,dx                        ;将余数复制到cx中
                mov dx,di                        ;防止溢出的除法,dx为商高16,ax为商的低16位
                push cx                                ;将余数压入栈中
                mov cx,ax                        
                inc bp                                ;计数器
                jcxz dwtoc_s2                ;判断商的低16是否为0
          jmp short dwtoc_s1
  dwtoc_s2:        
                mov cx,dx
                jcxz dwtoc_s3                ;判断商的高16是否为0
        jmp short dwtoc_s1
  dwtoc_s3:
                mov cx,bp                        ;设置dwtoc_s的循环次数
    dwtoc_s:                                ;将每步余数复制到ds:si中
                pop ax
                add al,30h
                mov ds:[si],al
                inc si
    loop dwtoc_s
  dwtoc_s4:
                mov ds:[si],cl                ;将0复制到字符串末尾
                pop bp
                pop bx
                pop di
                pop si
                pop cx
                pop ax
                pop dx
                ret
;*********************************************************子函数
;名称:wtoc
;功能:将word数据转换为十ascii码以0结尾字符串
;参数:(ax)=word型数据
;                 ds:si指向字符串的首地址
wtoc:        
                push dx
                push cx
                push si
                push bp                                        
                mov bp,0                                ;设置计数器
  wtoc_s2:        
                mov dx,0                                ;高16位清零
                mov cx,10
                div cx
                push dx                                        ;将余数压栈
                inc bp                                        ;计数器
                mov cx,ax
        jcxz wtoc_s1                                ;判断商是否0
  jmp short wtoc_s2
  wtoc_s1:
                mov cx,bp
                wtoc_s3:  
                        pop ax
                        add al,30h
                        mov ds:[si],al
                        inc si
                loop wtoc_s3
   wtoc_s4:        
    mov ds:[si],ch
        pop bp
        pop si
        pop cx
        pop dx
        ret
;*******************************************************
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,
;除数为word型,结果为dword型
;参数:(ax)=dword型数据的低16位
;     (dx)=dword型数据的高16位
;     (cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16为
;     (cx)=余数
divdw:        
        push di
        push si                                ;保存相关寄存器与栈中
        mov di,ax                        ;低16位L暂存di中
        mov si,dx                        ;高16为H暂存si中
        mov ax,dx
        mov dx,0                        ;计算高位
        div cx                                ;计算int(H/N)结果在ax中,rem(H/N)结果在dx中
        mov si,ax                        ;释放寄存器ax,(si)=int(H/N),商存于si中
        mov ax,di                        ;计算[rem(H/N)*65536+L]
        div cx                                ;计算[rem(H/N)*65536+L]/N,结果int在ax中rem在dx中
        mov cx,dx                        ;余数存于cx中
        mov dx,si                        ;高位除的商复制到dx中
        pop si
        pop di                                ;相关寄存器出栈
        ret
code ends
end start
评论次数(0)  |  浏览次数(380)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码