|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 aaasoros 于 2013-6-21 00:49 编辑
废话不多说,先上代码(是小菜参考网上答案自己写的。。。有点乱)
assume cs:code
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';(0-83)
dd 16,22,382,1356,2490,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;(84-167)
dw 3,7,9,13,28,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800;(168-209)
dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239
dw 260,304,333;(210-)
table ends
data segment
dw 32 dup(0)
data ends
code segment
start: mov ax,table
mov ds,ax
mov ax,data
mov es,ax
mov ax,0
mov bx,0
mov si,0
mov di,0
mov dh,3 ;第3行开始
mov dl,20 ;第20列开始
mov cx,21 ;一共有21行数据
;每次把一年的数据全部先变成字符,然后压入data段,
;然后再一次性的把这一行数据放入显存中,加上绿字属性,共循环21次
ya: push ax
push cx
push si
push di
push bx
push dx
mov ax,ds:[bx]
mov es:[di],ax
mov ax,ds:[bx+2]
mov es:[di+2],ax ;把年份压入data段
mov di,10
mov ax,ds:[bx+84]
mov dx,ds:[bx+84+2]
call zhuan ;把收入转成十进制字符压入data段
mov di,24
mov ax,ds:[si+168]
mov dx,0
call zhuan ;把人数转成十进制字符压入data段
mov di,31
mov ax,ds:[si+210]
mov dx,0
call zhuan ;把人均收入转成十进制字符压入data段
mov di,0
mov cx,32
xianshi:push cx
mov cl,ds:[di]
jcxz kong
inc di
pop cx
loop xianshi ;把data段的0全部转换成空格
mov cl,2
pop dx
call show_str ;把data段数据放入显存,使屏幕显示绿色字符串
add bx,4 ;dword数据指向下一个
add si,2 ;word数据指向下一个
add dh,1 ;显示下一行
pop cx
loop ya
mov ax,4c00h
int 21h
kong: mov al,20h
mov ds:[di],al
jmp xianshi
;子程序功能:把data段的数据变成绿色以字符串形式显示出来
show_str:push es
push ax
push bx
push si
mov ax,0b800h
mov es,ax
mov ax,160
mul dh
mov bx,ax
mov ax,2
mul dl
add bx,ax ;把(160*dh+2*dl)设为显存首地址es:bx
mov al,cl
mov cl,0
wei?: mov ch,ds:[si]
jcxz jiewei ;判断是否到尾部,若ds:[si]为0,则跳转
mov es:[bx],ch
mov es:1[bx],cl ;显示绿色字符
inc si ;下一个字符
add bx,2 ;下一个显存地址
jmp wei?
jiewei: pop si
pop bx
pop ax
pop es
ret
;zhuan子程序
;功能:把数据转换成十进制的字符串,字符串以0为结束
zhuan: push ax
push dx
push si
push di
push bx
push cx
mov cl,10
call chu
add cx,30h
push cx
inc si
mov cx,dx
jmp gao ;如果高位的商为0,跳转检测低位商
gao: mov cx,ax
jmp tuici ;如果低位的商为0,说明已完成字符的转换
tuici: mov cx,si
tui: pop cx
mov es:[di],cx
inc di
loop tui ;把字符放入data段中
mov al,0
mov es:[si],al ;设置结尾符号0
pop cx
pop bx
pop di
pop si
pop dx
pop ax
ret
;无溢出的除法(被除数为dword型,除数为word型,商为dword型)
;X:被除数 N:除数 H:高16位 L:低16位
;int():取商(如int(38/10)=3) rem():取余数(如rem(38/10)=8)
;公式:X/N=int(H/N)*65536(左移4个字节)+[rem(H/N)*65536+L]/N
;返回: (dx)=结果的高16位;
;(ax)=结果的低16位;
;(cx)=余数。
chu: push si
push dx
push ax
mov ax,dx
mov dx,0
div cx
mov si,ax
pop ax
div cx ;因为在上一次的除法中,dx中的数就是高位除法中的余数,所以不用变
mov cx,dx
mov dx,si
pop ax
pop dx
pop si
ret
code ends
end start
运行了多次,无效。。实在没办法只能debug单步调试了。。。然后出现状况了。。。
[img]file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\499322431\QQ\WinTemp\RichOle\](L8`_8YB}2E]S040{)O3@8.jpg[/img]
运行完chu子程序后,回到zhuan子程序,本来应该执行的是add cx,30h。但是debug里面显示的是add [bx+0000],BH
然后就跳到开头的mov dh,3 mov dl,20那里了,怎么会这样。。。。坐等大神解惑。。!!
[img=0,1]file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\499322431\QQ\WinTemp\RichOle\](L8`_8YB}2E]S040{)O3@8.jpg[/img]
[img]file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\499322431\QQ\WinTemp\RichOle\](L8`_8YB}2E]S040{)O3@8.jpg[/img]
|
|