用汇编程序在窗口格式化显示数据

目标:将下图数据按照格式输出到屏幕上

数据的预处理

将下图内容

显示到:

 

assume cs:code

data segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985'
    db '1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
    ;表示21年的21个字符串

    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980,590827
    dd 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个数据
data ends

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

stack segment
    dd 64 dup (0)
stack ends

temp segment
    db 16 dup(0)
temp ends

;注意代码块的接口就行了
code segment
start:  mov ax,stack
        mov ss,ax
        mov sp,256 ;自己定义一段栈空间(其实不定义stack segment也可以)

        call transfer ;用的是以前实验的代码,目的将处理过后的数据放到table segment

        mov dh,0
        mov dl,0
        mov cx,21
        mov ax,table
        mov ds,ax
        mov si,0

        ;循环显示21年的数据
show:   push cx
        mov cx,02
        mov dl,0
        call show_str
        add si,5 

        ;显示收入(4bytes)
        push ds
        push si
        mov bx,ds:[si]
        add si,2
        push dx
        mov dx,ds:[si]
        mov ax,temp
        mov ds,ax
        mov si,0
        mov ax,bx
        call dtoc
        pop dx
        mov dl,10
        call show_str
        pop si
        pop ds
        
        ;显示雇员数目
        add si,5
        call repeat

        ;显示平均工资
        add si,3
        call repeat

        add si,3
        inc dh
        pop cx
        loop show

        mov ax,4c00h
        int 21h

        ;因为显示平均工资和收入的一段代码是重复的就单独拎出来
repeat: mov bx,ds:[si]
        push ds
        push si
        mov ax,temp
        mov ds,ax
        mov si,0
        push dx
        mov dx,0
        mov ax,bx
        call dtoc
        mov si,0
        pop dx
        add dl,10
        call show_str
        pop si
        pop ds
        ret

transfer:   
        push ax
        push bx
        push cx
        push dx
        push si
        push di
        push es
        push ds

       mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        mov ax,stack

        mov cx,21
        mov bx,0
        mov di,0
        mov si,0
        mov bp,0

    s0: push cx
        mov cx,4
        mov bx,0

    s1: mov al,ds:[bp]
        mov es:[bx],al
        inc bp
        inc bx
        loop s1

        mov al,0
        mov es:[bx],al
        inc bx

        mov ax,ds:[si+84]
        mov es:[bx],ax
        add bx,2
        add si,2
        mov ax,ds:[si+84]
        mov es:[bx],ax
        add si,2
        add bx,2

        mov al,' '
        mov es:[bx],al
        inc bx

        mov ax,ds:[di+168]
        mov es:[bx],ax
        add di,2
        add bx,2

        mov al,' '
        mov es:[bx],al
        
        mov ax,es:[5]
        mov dx,es:[7]
        div word ptr es:[0ah]
        mov es:[0dh],ax

        mov al,' '

        mov es:[bx],al
        mov ax,es
        inc ax
        mov es,ax

        pop cx
        loop s0

        pop ds
        pop es
        pop di
        pop si
        pop dx
        pop cx
        pop bx
        pop ax
        ret

;以绿底显示字符串的模块,dh = 行号,dl = 列号,cl = 颜色
show_str:
        push ax
        push bx
        push cx
        push dx
        push si
        push di
        push es
        push ds

        add dh,1
        mov ax,0b800h
        mov es,ax
        mov al,dh
        mov ah,0ah
        mul ah
        mov bx,ax
        mov ax,es
        add ax,bx
        mov es,ax
        mov ch,0
        mov dh,0
        mov di,dx
        add di,di
        mov bx,cx

showStrs:        
        mov cl,ds:[si]
        jcxz strOk
        mov al,ds:[si]
        mov es:[di],al
        inc di
        inc si
        mov cx,bx
        mov es:[di],cl
        inc di
        jmp short showStrs

strOk:  pop ds
        pop es
        pop di
        pop si
        pop dx
        pop cx
        pop bx
        pop ax
        ret

;把数字转化为以0结束的字符串
;ax = 低16位,dx = 高16位
dtoc:   push ax
        push bx
        push cx
        push dx
        push si
        push di
        push es
        push ds

        mov cx,10
dtocS1: call divdw
        inc si
        add cx,30h
        push cx
        mov cx,ax
        or cx,dx
        jcxz strOk1
        mov cx,10
        jmp short dtocS1
        
strOk1: mov cx,si
        mov si,0
        mov bx,10
        sub bx,si

strS2:  pop ax
        mov ds:[si],al
        inc si
        loop strS2

        ;注意:
        ;要将不显示数字的区域用空格覆盖
        ;不然在多次运行exe文件时
        ;会出现数据重叠显示
        mov cx,bx
strBk:  mov al,' '
        mov ds:[si],al
        inc si
        loop strBk
        
        mov al,0
        mov ds:[si],al

        pop ds
        pop es
        pop di
        pop si
        pop dx
        pop cx
        pop bx
        pop ax
        ret

;除法模块,32位除16位防溢出
;输入 ax = 低16位,dx = 高16位 cx = 除数
;输出 ax = 低16位,dx = 高16位 cx = 余数
divdw:  push bx
        push es
        push ds
        push si
        push di

        mov bx,ax
        mov ax,dx
        mov dx,0
        div cx
        push ax
        mov ax,bx
        div cx
        mov cx,dx
        pop dx

        pop di
        pop si
        pop ds
        pop es
        pop bx
        ret
code ends
end start

 效果:

 

posted @ 2020-07-19 10:07  CSULuyao  阅读(329)  评论(0编辑  收藏  举报