汇编网首页登录博客注册
huangqihang的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
好友圈
文章收藏
友情链接

[2009-06-25 23:42] 课程设计1

5个多小时啊,总算完成了。

assume cs:dtoc

data 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'

dd16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

dw3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends

table segment
        db 40 dup(0)
table ends

dtoc segment
start:        mov ax,table
        mov ss,ax
        mov ax,data
        mov ds,ax
        mov sp,18
        mov cx,0fffh
        mov bx,0
        mov ax,0b800h
        mov es,ax           ;以上定位
        mov al,0ceh
s4:        mov es:[bx+1],al
        add bx,2
        loop s4             ;以上定义颜色
        mov cx,21
        mov ax,0            ;ax计算行数
s:        push ax
        mov ah,160
        mul ah
        mov di,ax
        pop ax
        call year           ;调用显示年份的子程序
        call revenue        ;调用显示收入的子程序
        call emploee        ;调用显示雇员数的子程序
        call equally        ;调用显示显示的子程序
        inc ax
        loop s
        mov ax,4c00h
        int 21h

year:        push cx
        push ax
        mov si,ax
        add si,si
        add si,si
        mov cx,4
        mov bx,0
        mov bp,0
        mov ah,160
        mul ah
        mov di,ax
s1:        mov al,[si+bx]
        mov es:[bp+di],al
        inc bx
        add bp,2
        loop s1
        pop ax
        pop cx
        ret

revenue:push ax
        push cx
        mov si,ax
        add si,si
        add si,si
        mov cx,4
        mov bx,0
        mov dh,[bx+si+87]
        mov dl,[bx+si+86]
        mov ah,[bx+si+85]
        mov al,[bx+si+84]
        mov bp,14
s2:        call change
        mov es:[bp+di+40],cl
        sub bp,2
        mov cx,ss:[0]
        inc cx
        loop s2
        pop cx
        pop ax
        ret

emploee:push ax
        push cx
        mov si,ax
        add si,si
        mov bp,10
        mov bx,0
        mov ah,[bx+si+169]
        mov al,[bx+si+168]
s3:        call change
        mov es:[bp+di+80],cl
        sub bp,2
        mov cx,ss:[0]
        inc cx
        loop s3
        pop cx
        pop ax
        ret

equally:push cx
        push ax
        mov si,ax
        mov bx,0
        add si,si
        mov ch,[bx+si+169]
        mov cl,[bx+si+168]
        add si,si
        mov dh,[bx+si+87]
        mov dl,[bx+si+86]
        mov ah,[bx+si+85]
        mov al,[bx+si+84]
        call divdw
        mov bp,10
s6:        call change
        mov es:[bp+di+120],cl
        sub bp,2
        mov cx,ss:[0]
        inc cx
        loop s6
        add bp,2
        pop ax
        pop cx
        ret

divdw:        push ax           ;解决除法溢出的子程序
        mov ax,dx
        mov dx,0
        div cx
        mov bx,ax
        pop ax
        div cx
        mov cx,dx
        mov dx,bx
        ret

change:        mov cx,10          ;将16进制数变成ASCII码的子程序
        call divdw
        add cl,30h
        mov ss:[0],ax
        add ss:[0],dx
        ret

dtoc ends

end start


其中有一些无用的0,我不知道怎么去掉.写完后我才发现,如果一列一列地显示,似乎比一行一行地显示要好一些。
评论次数(3)  |  浏览次数(654)  |  类型(汇编作业) |  收藏此文  | 

[  游客   发表于  2009-06-26 09:01  ]

前面有一些无用的0,我不知道怎么去掉
=================
首先应该知道这些0是怎么出来的,把一个数据分解成一个个的数字字符后,也就是你的16进制数变成ASCII码的子程序运行后,把每个字符都用栈保存,此时应该确定你分解出来的是否正确。如果正确,然后,屏幕定位的时候,从右向左,依次把栈内的数据出栈,直到所有都出来,那么就不会有向内存中写入0的现象了。也就是有多少分解出来的字符你就得显示多少。
必须得把这个问题给弄掉,里面可能有一些认识或处理失误的地方。

[  游客   发表于  2009-06-26 09:09  ]

问题出在,你数据在分解成数字字符的过程中,明明你的数据已经是0了,可是还在进行操作,所以,你得到的余数字符一直就是0了,而你每次循环的次数都是一样的,所以,你的数据一样长,不够位数的就用0填充了。
你的程序这样是不行的,数据到底多长我们不能写死,我们要根据将数据最终分解出来的个数去自动控制显示长度。楼上提到的方法是可行的,先将一个数据全部分解好了,然后将这些分解好的数字字符都一次显示出来。

[  huangqihang   发表于  2009-06-26 21:45  ]

哈,终于完善了,我找了个地址存起来了。

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码