码迷,mamicode.com
首页 > 其他好文 > 详细

汇编课程设计

时间:2017-06-08 13:13:43      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:show   cal   开始   字节   格式   sum   logs   blog   nis   

技术分享
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

 

汇编课程设计

标签:show   cal   开始   字节   格式   sum   logs   blog   nis   

原文地址:http://www.cnblogs.com/TreeDream/p/6961979.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!