90182si 发表于 2017-12-19 21:47:06

课程设计一

本帖最后由 90182si 于 2017-12-19 21:51 编辑



assume cs:code,ds:data
data segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
    db '1985','1986','1987','1988','1989','1990','1991','1992','1993','1994'
    db '1995'
    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980
    dd 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,11542,14430,15257,17800
        db 30 dup(0);临时数据段
data ends
code segment       
start:
        mov ax,data    ;思路:将年份,收入,员工数,平均数依次入栈,再依次保存到临时数据段,
        mov ds,ax           ;最后从数据段中出来到0b800h显存区,就这样循环21次
        mov bx,0
        mov si,0
        mov di,0d2h    ;临时数据段地址84+84+42=210=d2h
        mov dh,4           ;从第四=五行显示
        mov cx,21
mains:
        push cx
        push bx
        push di
        push si       
        push dx       
        mov ax,
        mov ,ax
        mov ax,
        mov ,ax        ;年份       
        mov ax,
        mov dx,;每次加4字节
        add di,5      ;di+5,因为年份占4字节外加一个0,共5个字节
        call dtoc                 ;收入       
        mov cx, ;因为dw只占2个字节,bx每次+4,si每次+2,因此不能用bx代替si,有很多朋友这出现过问题
        call divdw
        mov dx,0
        add di,16                ;先将平均数保存
        call dtoc                 ;平均数       
        sub di,8                ;再保存员工数
        mov ax,
        call dtoc                ;员工数
show:
        pop dx                        ;行
        mov dl,8                ;列
        mov cl,66          ;颜色
        mov si,0d2h                ;从0d2h
        call show_str   ;显示年份
        add si,5
        add dl,10                ;列+10,间隔,可以自行修改
        call show_str   ;显示收入
        add si,8
        add dl,10
        call show_str   ;显示员工数
        add si,8
        add dl,10
        call show_str   ;显示平均数
        pop si
        pop di
        pop bx
        add si,2
        add bx,4
        inc dh          ;下一行
        pop cx
        loop mains
        mov ax,4c00h
        int 21h       
show_str:             ;以下三个小程序可以直接拿来用,这里不作解释
        push si
        mov ax,0b800h;(ax,dx,si,di)
        mov es,ax    ;
        mov al,160   ;
        mul dh       ;
        mov di,ax    ;
        mov al,2   ;
        mul dl       ;
        add di,ax    ;       
next:
        mov al,
        cmp al,0
        je endret
        mov es:,al
        mov es:,cl
        inc si
        add di,2
        jmp next
endret:
        pop si
        ret       
dtoc:
        push ax
        push dx
        push cx
        push si
        push di
        mov si,0       
tw: mov cx,ax       
        jcxz ok
        mov cx,10
        call divdw               
        add cx,48
        push cx       
        inc si
        jmp tw
ok: mov cx,si
of: pop ax
        mov ,ax
        inc di
        loop of
        pop di
        pop si
        pop cx
        pop dx
        pop ax
        ret
divdw:
        push bx;(ax,dx,cx)
        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

页: [1]
查看完整版本: 课程设计一