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,我不知道怎么去掉.写完后我才发现,如果一列一列地显示,似乎比一行一行地显示要好一些。
- [huangqihang] 哈,终于完善了,我找了个地址存起来了。 06/26 21:45
- [游客] 问题出在,你数据在分解成数字字符的过程中,明明你的数据已经是0了,可是还在进行操作,所以,你得到的余 06/26 09:09
- [游客] 前面有一些无用的0,我不知道怎么去掉 ================= 首先应该知道这些0是怎 06/26 09:01
- [游客] 呵呵。这次好多了。多理解题目的意思。后面还有两个子程序呢,做了之后,就可以运用到课程设计1中了,要仔 06/23 16:23
- [mess] 程序结果没问题,根据我们平时十进制的除法的习惯,很容易能弄明白公式~_~ 06/23 12:26
- [huangqihang] 哦哦,我居然没有发现它要写的是一个调用的子程序,不过改正也很容易。我就不改了。 06/22 23:20
- [游客] 哦,是这样啊,我都还不知道它给出dh和dl是干什么的呢。 我把它改正好了: assume cs: 06/22 22:06
- [wsrf] 你的子程序只能在一个固定的行和列位置显示,根本就不符合要求。行和列是由dh和dl中的值来决定的。并且 06/22 10:59
[ 游客 发表于 2009-06-26 09:01 ]
前面有一些无用的0,我不知道怎么去掉
=================
首先应该知道这些0是怎么出来的,把一个数据分解成一个个的数字字符后,也就是你的16进制数变成ASCII码的子程序运行后,把每个字符都用栈保存,此时应该确定你分解出来的是否正确。如果正确,然后,屏幕定位的时候,从右向左,依次把栈内的数据出栈,直到所有都出来,那么就不会有向内存中写入0的现象了。也就是有多少分解出来的字符你就得显示多少。
必须得把这个问题给弄掉,里面可能有一些认识或处理失误的地方。
[ 游客 发表于 2009-06-26 09:09 ]
问题出在,你数据在分解成数字字符的过程中,明明你的数据已经是0了,可是还在进行操作,所以,你得到的余数字符一直就是0了,而你每次循环的次数都是一样的,所以,你的数据一样长,不够位数的就用0填充了。
你的程序这样是不行的,数据到底多长我们不能写死,我们要根据将数据最终分解出来的个数去自动控制显示长度。楼上提到的方法是可行的,先将一个数据全部分解好了,然后将这些分解好的数字字符都一次显示出来。
[ huangqihang 发表于 2009-06-26 21:45 ]
哈,终于完善了,我找了个地址存起来了。