aaasoros 发表于 2013-6-21 00:48:21

王爽汇编语言 课程设计1 坐等大神求解(代码比较长。。)

本帖最后由 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:
                mov es:,ax
                mov ax,ds:
                mov es:,ax                ;把年份压入data段
                mov di,10
                mov ax,ds:
                mov dx,ds:
                call zhuan                              ;把收入转成十进制字符压入data段
                mov di,24
                mov ax,ds:
                mov dx,0
                call zhuan                              ;把人数转成十进制字符压入data段
                mov di,31
                mov ax,ds:
                mov dx,0
                call zhuan                              ;把人均收入转成十进制字符压入data段
                mov di,0
               
                mov cx,32
xianshi:push cx
                mov cl,ds:
                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:,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:
               jcxz jiewei                ;判断是否到尾部,若ds:为0,则跳转
               mov es:,ch
               mov es:1,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:,cx
                inc di
                loop tui                        ;把字符放入data段中
                mov al,0
                mov es:,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个字节)+/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单步调试了。。。然后出现状况了。。。
file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\499322431\QQ\WinTemp\RichOle\](L8`_8YB}2E]S040{)O3@8.jpg



运行完chu子程序后,回到zhuan子程序,本来应该执行的是add cx,30h。但是debug里面显示的是add ,BH
然后就跳到开头的mov dh,3         mov dl,20那里了,怎么会这样。。。。坐等大神解惑。。!!
file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\499322431\QQ\WinTemp\RichOle\](L8`_8YB}2E]S040{)O3@8.jpg
file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\499322431\QQ\WinTemp\RichOle\](L8`_8YB}2E]S040{)O3@8.jpg

lztx 发表于 2013-6-21 11:14:35

这是什么情况啊

aaasoros 发表于 2013-6-22 09:37:42

坐等大神啊!!!!
页: [1]
查看完整版本: 王爽汇编语言 课程设计1 坐等大神求解(代码比较长。。)