zoukankan      html  css  js  c++  java
  • 用汇编程序在窗口格式化显示数据

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

    数据的预处理

    将下图内容

    显示到:

     

    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

     效果:

  • 相关阅读:
    Winform 异步更新listbox
    Object-C
    易学易懂
    C# login with cookie and fiddler2
    开源 侧滑 和 Tab滑动翻页 控件
    Mysql Java type mapping
    jQuery滑动导航菜单
    js判断是移动端还是pc端
    设为主页和加入收藏
    原生javascript效果:无缝滚动
  • 原文地址:https://www.cnblogs.com/csuchenzc/p/13338828.html
Copyright © 2011-2022 走看看