鱼C论坛

 找回密码
 立即注册
查看: 2195|回复: 2

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

[复制链接]
发表于 2013-6-21 00:48:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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]

QQ图片20130621004459.jpg

运行完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]

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-21 11:14:35 | 显示全部楼层
这是什么情况啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-22 09:37:42 | 显示全部楼层
坐等大神啊!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 07:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表