|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
换了好几种方法了,就是写不对,也不知道哪里出问题了。
哪位哥哥姐姐帮忙看下,小弟先谢过了。
assume cs:code,ds:data,ss:stack
data segment
db '1975','1976','1977','1978','1979','1980','1981'
db '1982','1983','1984','1985','1986','1987','1988'
db '1989','1990','1991','1992','1993','1994','1995' ;年份
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479
dd 140417,197514,345980,590827,803530,1183000,1843000
dd 2759000,3753000,4649000,5937000 ;收入
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037
dw 5635,8226,11542,14430,15257,17800 ;人数
data ends
stack segment
db 500 dup (0)
stack ends
table segment
db 500 dup (0)
table ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov ax,table
mov es,ax
mov sp,16
mov bx,0
mov di,0
mov si,0
;---------------------------------------------------------------------
;复制数据
mov cx,21 ;循环次数
first:
;显示年份
mov ax,ds:[bx+0]
mov es:[di+0],ax
mov ax,ds:[bx+2]
mov es:[di+2],ax
mov al, 32
mov es:[di+4], al
;显示收入
mov ax,ds:[bx+84]
mov es:[di+5],ax
mov ax,ds:[bx+86]
mov es:[di+7],ax
mov al, 32
mov es:[di+9], al
;显示人数
mov ax,ds:[si+168]
mov es:[di+10],ax
mov al, 32
mov es:[di+12], al
;显示人均收入
mov ax,ds:[bx+84]
mov dx,ds:[bx+86]
push cx
mov cx,ds:[si+168]
div word ptr cx
pop cx
mov es:[di+13],ax
mov al, 32
mov es:[di+15], al
mov bx,4
mov di,16
mov si,2
loop first
;---------------------------------------------------------------------
show:mov si, 0
mov di, 0
mov bx, 0
mov cx, 21
s:mov dh,5 ;行
mov cl,10 ;颜色
push cx
mov si,0
mov ax,es:[di+0]
mov ds:[si+0],ax
mov ax,es:[si+2]
mov ds:[si+2],ax
mov ax,0
mov ds:[si+4],ax
mov dl,10 ;列
call show_str
;收入
mov ax,es:[di+5]
mov dx,es:[di+7]
mov si,0
call dwtoc
mov dl,18
call show_str
;人数
mov ax,es:[di+10]
mov si,0
call dtoc
mov dl,26
call show_str
;人均收入
mov ax,es:[di+13]
mov si,0
call dtoc
mov dl,34
call show_str
add di,16
pop cx
inc dh
loop s
mov ax,4c00h
int 21h
;---------------------------------------------------------------------
;将dword转为十进制字符串
dtoc:mov cx,0
push cx
s1:mov dx,0
mov cx,10d ;除数
div cx
mov cx,dx ;dx余数
add cx,30h ;余数累加
push cx ;入栈
inc bx ;统计次数
mov cx,ax ;低位商作为循环次数
jcxz s2 ;当为零时跳出循环
jmp short s1
s2:mov cx,dx ;检测高位商
jcxz s3
jmp short s1
s3:mov cx,bx ;统计的循环次数赋给循环变量
s4:pop ax ;入栈数据出栈
mov ds:[si],al ;结果存至ds段
inc si
loop s4
mov al,0
mov ds:[si],al ;设置结尾符零
ok2:pop cx
ret
;---------------------------------------------------------------------
;将dword转为十进制字符串
dwtoc:mov cx,0
push cx
sx1:
mov cx,10d ;除数
call divdw ;商低位在ax中,高位在dx,'余数'在cx中
mov dx,0
add cx,30h ;余数累加
push cx ;入栈
inc bx ;'统计次数'
mov cx,ax ;低位商作为循环次数
jcxz sx2 ;当为零时跳出循环
jmp short sx1
sx2:mov cx,dx ;检测高位商
jcxz sx3
jmp short sx1
sx3:mov cx,bx ;统计的循环次数赋给循环变量
sx4:pop ax ;入栈数据出栈
mov ds:[si],al ;结果存至ds段
inc si
loop sx4
mov al,0
mov ds:[si],al ;设置结尾符零
ok22:pop cx
ret
;---------------------------------------------------------------------
;进行不会产生溢出的除法运算
divdw:push ax
mov ax,dx ;高位赋给低位
mov dx,0
div cx ;除完后ax存高位商,dx存余数
mov bx,ax ;高位商赋给bx保存
pop ax ;低位出栈
div cx ;低位+高位除后的余数
mov cx,dx ;把第二次除法的'余数'保存到cx
mov dx,bx ;把第一次除法的高位商保存到dx,低位商即存在ax中
ret
;---------------------------------------------------------------------
;在指定的位置 用指定的颜色 显示一个用0结束的字符串
show_str:push es
push ax
push bx
push cx
push di
mov ax,0b800h
mov es,ax ;显示段
dec dh
mov al,0a0h ;被乘数
mul dh ;行 结果存在ax中
mov dh,0
add dl,dl ;列
add ax,dx ;ax=ax(行)+dx(dh=0,dl=列)
mov di,ax ;偏移地址指向显存
mov ah,cl ;颜色
sshow:mov cl,ds:[si] ;数据
mov ch,0 ;清空cx高位
jcxz ok1
mov al,cl
mov es:[di+0],al ;传至显存显示
mov es:[di+1],ah ;字符属性
inc si
add di,2
jmp short sshow
ok1:pop di
pop cx
pop bx
pop ax
pop es
ret
code ends
end start
|
|