思路是:将所有所需要的数字,以字节(一个字节表示单个数字)的形式写入 es段,再然后从es段中再调用到b800段达到显示的效果,由于给定寄存器少,我就想用栈结构的方式来传递变量;
我定义了data 段存放原始数据,开始的表示21年的字符串就不用修改,照搬到es段中,dword类型数据,开始调用除法溢出的部分,把得到余数压入栈中,再循环结束,再出栈就可以把余数倒取写入es段中,从dword类型数据开时,我把每8个字节当成一块区域,存放。然后时wordl类型的数据,一样要调用除法溢出,把dx改为0000h,就一样用了。中间的es段,我重定向到一块空白的区域,用debug查看后比较美观,数据也比较整齐。
下面贴代码
ssume cs:code,ds:data
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 345980,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,14257,17800
;以上表示是21年公司雇员人数的21个word型数据
dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239,260
dw 304,333
;21年雇员人均收入
data ends
code segment
start: mov ax,data
mov ds,ax
mov cx,84
mov di,0
mov ax,0800h
mov es,ax ;如果默认的话,后面会有其他数据写到es段中,后面数据在处理就不好处理了。
btoc: mov al,[di]
mov es:[di],al
inc di
loop btoc ;将data段数据写到es段中
mov si,84
mov cx,21
dtoc: push cx
push si
push di
mov ax,[si] ;将dword型数据转变为表示十进制数的字符串,字符串以0为结尾符。
mov dx,[si+2]
mov si,0
s: call divdw
add bx,30h
push bx
mov cx,ax
inc si
jcxz ok
jmp s
ok: mov cx,si
s1 :pop bx
mov es:[di],bl
inc di
loop s1
mov byte ptr es:[di],00h
pop di
add di,8
pop si
add si,4
pop cx
loop dtoc
;上面这部分解决dword类型的数据
mov cx,42
wtoc:push cx
push si
push di
mov ax,[si]
mov dx,0
mov si,0
s2: call divdw
add bx,30h
push bx
mov cx,ax
inc si
jcxz okb
jmp s2
okb: mov cx,si
s3 :pop bx
mov es:[di],bl
inc di
loop s3
mov byte ptr es:[di],00h
pop di
add di,8
pop si
add si,2
pop cx
loop wtoc ;这部分解决word类型的数据 1.找了好久的错误,原来是单词打错了,哎!
mov ax,0b800h ;下面部分解决显示问题
mov ds,ax
mov al,07h ;颜色:黑底白字
mov di,0
mov bx,0
mov si,160
mov cx,21
BBQ: push cx
push si
mov cx,4
s4:mov ah,es:[bx]
mov [si+4],ah ;164
mov [si+5],al ;165
inc bx
add si,2
loop s4
s5:pop si
push si
push di
s5t:mov ah,es:[di+84]
mov cl,ah
jcxz s6
mov [si+26],ah
mov [si+27],al
inc di
add si,2
jmp s5t ;第二个错误,找了好久。jmps5t,之前jmp到s5,导致循环不了了,下面也是同样的
s6:pop di
pop si
push si
push di
s6t:mov ah,es:[di+252]
mov cl,ah
jcxz s7
mov [si+46],ah
mov [si+47],al
inc di
add si,2
jmp s6t
s7:pop di
pop si
push si
push di
s7t:mov ah,es:[di+420]
mov cl,ah
jcxz s8
mov [si+66],ah
mov [si+67],al
inc di
add si,2
jmp s7t
s8:pop di
pop si
add di,8
add si,160
pop cx
loop BBQ
mov ax,4c00h
int 21h
divdw: mov cx,10 ;这部分是做除法溢出
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
mov bx,cx ;bx做余数
ret
code ends
end start
下面是运行结果
1977由于显示后被新的操作行覆盖了。