用汇编程序在窗口格式化显示数据
目标:将下图数据按照格式输出到屏幕上
将下图内容
显示到:
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
效果: