用我的代码吧,我的能用
assume cs:code,ds:data,es:table
table 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*4=84数字
;偏移84,收入
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000;21*4=84
;偏移168,雇员
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800;21*2=42
;偏移210,人均收入
dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239
dw 260,304,333
table ends
data segment
db 32 dup (0)
;1995 5937000 17800 333
; 8 19 28
data ends
code segment
start:
mov ax,table
mov es,ax
mov ax,data
mov ds,ax
mov di,0;指向table,es里的年份和收入
mov bp,0;指向table,es里的雇员和人均收入
mov bl,3;从第3行开始显示
mov cx,21;循环21次,一次显示一行,每行里读到e即65h时停止显示
s:;移动年份
push cx
mov si,0;指向data,ds
mov cx,16
s0:mov ds:[si],word ptr 0 ;将ds:[si]中的数据清零
add si,2
loop s0
mov si,0
mov ax,es:[di]
mov ds:[si],ax
mov ax,es:[di+2]
mov ds:[si+2],ax
;移动收入
mov ax,es:[di+84]
mov dx,es:[di+84+2]
mov cx,10
mov si,8
call dtoc
;移动雇员
mov ax,es:[bp+168]
mov dx,0
mov cx,10
mov si,19
call dtoc
;移动人均收入
mov ax,es:[bp+210]
mov dx,0
mov cx,10
mov si,28
call dtoc
mov byte ptr ds:[31],65h;用e来判断结束,e的ASC2码为65h
mov dh,bl;行号,0~24
mov dl,10;列号,0~79
mov cl,2;颜色
mov si,0;ds:si指向字符串的首地址
call show_str
inc bl
add di,4
add bp,2
pop cx
loop s
mov ax,4c00h
int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
show_str:
push ax
push bx
push cx
push dx
push di
push ds
push es
push si
mov al,0a0h
mul dh
mov di,ax;获得行号地址
mov al,2
mul dl;获得列号地址
add di,ax;获得列号后,相加知道偏移地址
mov ax,0B800H
mov es,ax;显存地址 es:di
mov bh,cl
mov cl,0
show_str_s:
mov bl,ds:[si];用bx来显示
mov ch,bl
sub ch,65h;读到是65h时,停止显示
jcxz show_str_ok
mov es:[di],bx
add di,2;这里是加2,不是加1
inc si
jmp short show_str_s
show_str_ok:
pop si
pop es
pop ds
pop di
pop dx
pop cx
pop bx
pop ax
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
dtoc:
push bx
push di
push ds
push es
push si
mov di,0;这里要注意
dtoc_s:
call divdw
;进行不会产生溢出的除法运算
;返回结果 dx高16位,ax为低16位
;cx为余数
add cx,30h
push cx
inc di;记录入栈个数
mov cx,dx
or cx,ax
jcxz dtoc_ok
mov cx,0ah;N
jmp dtoc_s
dtoc_ok:
mov cx,di
dtoc_pop:
pop dx
mov ds:[si],dl;出栈将值放进ds:[si]
inc si
loop dtoc_pop
pop si
pop es
pop ds
pop di
pop bx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
divdw:
push bx
push di
push ds
push es
push si
mov di,ax;先备份好L
mov ax,dx
mov dx,0
div cx
mov bx,ax;注意ax就是int(H/N)*65536的值,而这时的dx就是rem(H/N)*65536
mov ax,di;把存的L拿出来用
div cx
mov cx,dx
mov dx,bx
pop si
pop es
pop ds
pop di
pop bx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
code ends
end start
|