//目录

汇编课程设计

内容:显示一个公司的信息,计算人均收入;

Source Code:

assume cs:codesg,ss:stack

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'
       ;以上是表示21年的21个字符串

       dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
       dd 245980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
       ;以上是表示21年公司总收入的21个dword型数据

       dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
       dw 11542,14430,15257,17800
       ;以上是表示21年公司雇员人数的21个word型数据
data ends

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

stack segment
       dw 32 dup (0)
stack ends

buffer segment
       db 32 dup (0)
buffer ends

codesg segment
start:
    mov ax,data
    mov ds,ax
    mov di,0
    mov si,4*21+4*21    ;指向员工

    mov ax,table
    mov es,ax           ;es存表
    mov bx,0
    call finishing      ;将data段格式化到es段了

    mov ax,stack
    mov ss,ax
    mov sp,64

    mov ax,buffer   ;数据缓冲区,接受转换后的每一个字符
    mov ds,ax
    mov si,0        ;ds:si指向缓冲区
    mov ax,table
    mov es,ax
    mov bx,0        ;ex:bx指向table
    mov dh,5        ;第一行
    mov cx,21

    s:
        push cx

        mov ax,es:[bx]
        mov ds:[si],ax
        mov ax,es:[bx+2]
        mov ds:[si+2],ax          ;向缓冲区中写入一条年信息
        mov byte ptr ds:[si+4],0
        mov dl,20                 ;显示年份
        mov cl,2
        call show_str

        push dx
        mov ax,es:[bx+5]          ;读取一条总收入信息
        mov dx,es:[bx+7]
        call dtoc                 ;调用dtoc将数值转换成字符串到缓冲区中
        pop dx
        mov dl,30                 ;显示员工
        call show_str

        push dx
        mov ax,es:[bx+0ah]        ;读取一条总人数信息
        mov dx,0
        call dtoc                 ;调用dtoc将数值转换成字符串到buffer中
        pop dx
        mov dl,40       ;显示字符串
        call show_str

        push dx
        mov ax,es:[bx+0dh]       ;读取一条人均收入信息
        mov dx,0
        call dtoc         ;调用dtoc将数值转换成字符串到buffer中
        pop dx
        mov dl,50       ;显示字符串
        call show_str

        add dh,2         ;每隔一行打印一条数据
        add bx,10h     ;让es:bx指向table的下一行数据

        pop cx
        loop s

    mov ax,4c00h
    int 21h

dtoc:
       push ax
       push bx
       push cx
       push dx
       push bp
       push si

       mov bp,0
  dtoc_s0:
       mov cx,10d
       call divdw
       push cx
       inc bp
       mov cx,ax        ;除到商为0为止
       inc cx
       loop dtoc_s0

       mov cx,bp
  dtoc_s:
       pop bx
       add bl,30h
       mov ds:[si],bl
       inc si
       loop dtoc_s

       mov byte ptr ds:[si],0

       pop si
       pop bp
       pop dx
       pop cx
       pop bx
       pop ax
       ret


divdw:  ;子程序定义开始
       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

show_str:
    push ax
    push bx
    push cx
    push dx
    push es
    push bp
    push si

    mov ax,0b800H
    mov es,ax
    mov al,80*2     ;一行160个字节
    mul dh          ;刚开始是第五行;高位是行,低位是列

    mov dh,0
    add ax,dx       ;列数*2
    add ax,dx

    mov bp,ax
    mov al,cl       ;颜色
    mov cx,0
    mov cl,ds:[si]  ;ds:[si]为缓冲区指针
    inc si

    show_str_s:
        mov es:[bp],cl  ;低位ascii
        inc bp
        mov es:[bp],al  ;高位属性
        inc bp
        mov cl,ds:[si]  ;如果这个字节是0,退出循环
        inc si
        inc cx
    loop show_str_s

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

finishing:
    push ax
    push bx
    push cx
    push di
    push si
    push bp

    mov cx,21

    finishing_s:
    ;填充时间
    mov ax,ds:[di]
    mov es:[bx],ax
    mov ax,ds:[di+2]
    mov es:[bx+2],ax

    ;填充收入,收入是双字节的
    mov ax,ds:[di+4*21]
    mov dx,ds:[di+4*21+2]   ;高位
    mov es:[bx+5],ax
    mov es:[bx+5+2],dx

    ;填充人数
    mov bp,ds:[si]
    mov es:[bx+0aH],bp

    ;填充人均收入
    div bp
    mov es:[bx+0dH],ax

    add bx,16   ;table换一行
    add di,4    ;年份换一个
    add si,2    ;员工修改两个字节
    loop finishing_s

    pop bp
    pop si
    pop di
    pop cx
    pop bx
    pop ax
    ret


codesg ends
end start
View Code

思路:

1、首先将数据格式化到es:bx中

2、将格式化的数据先加载到ds:si中;

3、根据不同的数据采取不同的措施,年份直接转换字符串,其他的数值数据,先转换为字符;

4、转换字符的时候,将余数加到栈中保存,然后覆盖到原来的缓冲区中;

5、显示字符,要控制每种数据的位置;

posted @ 2017-06-08 11:37  小草的大树梦  阅读(347)  评论(0编辑  收藏  举报