|
主题 : : 大吼一声,课程设计一完工,爽!请各位点评 [待解决] |
回复[ 3次 ]
点击[ 298次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-08-31 17:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:14
信誉值:2
注册日期:2009-08-13 10:23 |
总算可以进军十一章了,在第十章停了将近5天,差点暴走,附上程序,和各位分享,请各位点评!
assume cs:code,ds:data,ss:stack
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'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
dw 21 dup(0)
data ends
stack segment
dw 512 dup(0)
stack ends
code segment
start:mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov si,0
mov di,640
mov sp,512
mov bp,0
mov bx,10
mov ax,47104
mov es,ax
mov cx,21
push si
push bx
push di
call nian ;显示年代
pop di
pop bx
mov si,0
call renjun ;计算人均
mov cx,21
mov ax,0
mov si,0
call divdw ;总收入数据转换ascll码压栈
call bei ; 准备数据
mov bx,16 ;显示位置
mov si,bx ;保存位置
call show_str ;显示总收入
mov dx,0 ;dx清零
mov si,0 ;si清零
call zifu ;雇员和人均转换ascll码压栈
call bei
mov bx,38
mov si,bx
call show_str ;显示雇员
call bei
mov bx,56
mov si,bx
call show_str ;显示人均
mov ax,4c00h
int 21h
nian:push cx ;显示年的子程序
mov cx,4
mov bx,0
s1:mov al,ds:[si]
mov ah,2
mov word ptr es:[di+bx],ax
inc si
dec cx
add bx,2
jcxz ok
jmp short s1
ok:add di,160
pop cx
jcxz ot
loop nian
ot:ret
bei:mov di,640 ; 准备数据子程序
mov cx,21
mov bp,0
mov ax,47104
mov es,ax
ret
renjun:pop es ;计算人均子程序
mov cx,21
s3:mov ax,ds:[si+86]
mov dx,0
div word ptr ds:[bp+168]
mov bx,ax
mov ax,ds:[si+84]
div word ptr ds:[bp+168]
mov ds:[bp+212],bx
mov ds:[bp+210],ax
add bp,2
add si,4
jcxz ok1
loop s3
ok1:mov bp,0
push es
ret
show_str:pop ax ;显示子程序
mov bp,cx
c:pop cx
jcxz d
mov ch,2
mov word ptr es:[di+bx],cx
add bx,2
jmp short c
d:add di,160
mov bx,si
dec bp
mov cx,bp
jcxz ot2
jmp short c
ot2:push ax
ret
divdw:pop es ;总收入转换子程序
s4:mov bx,10
mov bp,cx
mov ax,ds:[si+166]
mov dx,0
div bx
mov di,ax
mov ax,ds:[si+164]
div bx
add dx,30h
push dx
sub si,4
s5:mov cx,10
mov bx,ax
mov ax,di
mov dx,0
div cx
mov di,ax
mov ax,bx
div cx
add dx,30h
push dx
mov cx,ax
jcxz s6
jmp short s5
s6:dec bp
mov cx,bp
jcxz ok2
mov bx,0
push bx
jmp short s4
ok2:push es
ret
zifu:pop es ;雇员和人均转换子程序
mov cx,42
mov bp,cx
s8:mov ax,ds:[si+250]
mov bx,10
sub si,2
s7:div bx
add dx,30h
push dx
mov dx,0
mov cx,ax
jcxz s9
jmp short s7
s9:dec bp
mov cx,bp
jcxz ok3
mov bx,0
push bx
jmp short s8
ok3:push es
ret
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-08-31 20:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:14
信誉值:2
注册日期:2009-08-13 10:23 |
发现一重大问题,好像循环出现了问题,再找找看,按g命令显示两次 | | |
|
|
|
|
[第2楼]
[ 回复时间:2009-08-31 21:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:14
信誉值:2
注册日期:2009-08-13 10:23 |
感觉注释添加的太少,自己看了都有点晕,再多写点注释,我的程序还有点问题,还要向大家请教,按两次g命令
assume cs:code,ds:data,ss:stack
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'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
dw 21 dup(0)
data ends
stack segment
dw 512 dup(0)
stack ends
code segment
start:mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov si,0
mov di,640 ;确定显示数据的行号起始点
mov sp,512
mov bp,0
mov bx,10
mov ax,47104 ;显卡地址起始点
mov es,ax
mov cx,21
push si
push bx
push di
call nian ;显示年代
pop di
pop bx
mov si,0
call renjun ;计算人均
mov cx,21
mov ax,0
mov si,0
call divdw ;总收入数据转换ascll码压栈
call bei ; 准备数据,后面show_str里面要用到得常量数据
mov bx,16 ;确定显示数据的列位置
mov si,bx ;保存位置
call show_str ;显示总收入
mov dx,0 ;dx清零
mov si,0 ;si清零
call zifu ;雇员和人均转换ascll码压栈
call bei
mov bx,38
mov si,bx
call show_str ;显示雇员
call bei
mov bx,56
mov si,bx
call show_str ;显示人均
mov ax,4c00h
int 21h
;--------------------------------------------------------------下面是子程序
nian:push cx ;显示年的子程序
mov cx,4 ;年份内循环次数
mov bx,0
s1:mov al,ds:[si]
mov ah,2 ;数据颜色
mov word ptr es:[di+bx],ax ;将数据放入显视段
inc si
dec cx
add bx,2 ;列号增加
jcxz ok ;一组数据输入完毕,跳到ok
jmp short s1
ok:add di,160 ;行号增一
pop cx ;外循环次数出栈
jcxz ot
loop nian
ot:ret
bei:mov di,640 ; 准备数据子程序
mov cx,21
mov bp,0
mov ax,47104
mov es,ax
ret
renjun:pop es ;保存下一条指令地址 ;计算人均子程序
mov cx,21
s3:mov ax,ds:[si+86] ;
mov dx,0
div word ptr ds:[bp+168]
mov bx,ax
mov ax,ds:[si+84]
div word ptr ds:[bp+168]
mov ds:[bp+212],bx
mov ds:[bp+210],ax
add bp,2
add si,4
jcxz ok1
loop s3
ok1:mov bp,0
push es
ret
show_str:pop ax ;显示子程序
mov bp,cx ;保存循环次数
c:pop cx ;将栈中数据出栈,若为零则一组数据输完,跳至d处
jcxz d
mov ch,2
mov word ptr es:[di+bx],cx
add bx,2
jmp short c
d:add di,160 ;增加行号
mov bx,si ;将调用show_str之前的保存的列地址付给bx,还原列号
dec bp ;循环数自减
mov cx,bp
jcxz ot2 ;显示结束,跳出
jmp short c
ot2:push ax
ret
divdw:pop es ;总收入转换子程序
s4:mov bx,10
mov bp,cx ;用divdw进行不会产生溢出的除法运算
mov ax,ds:[si+166]
mov dx,0
div bx
mov di,ax ;保存高位的商,为下面子循环准备
mov ax,ds:[si+164]
div bx
add dx,30h
push dx ;字符入栈
sub si,4
s5:mov cx,10 ;一次除法运算后,进行余下字符转换
mov bx,ax ;保存低位商
mov ax,di ;调出高位商
mov dx,0
div cx
mov di,ax
mov ax,bx
div cx
add dx,30h
push dx
mov cx,ax
jcxz s6
jmp short s5
s6:dec bp
mov cx,bp ;循环自减
jcxz ok2
mov bx,0
push bx
jmp short s4
ok2:push es
ret
zifu:pop es ;雇员和人均转换子程序
mov cx,42 ;雇员和人均为同类数据一并处理压栈
mov bp,cx
s8:mov ax,ds:[si+250] ;从后往前压
mov bx,10
sub si,2
s7:div bx
add dx,30h
push dx
mov dx,0
mov cx,ax
jcxz s9
jmp short s7
s9:dec bp
mov cx,bp
jcxz ok3
mov bx,0
push bx
jmp short s8
ok3:push es
ret
code ends
end start | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-08-31 21:11 ]
[引用]
[回复]
[ top ] | |
荣誉值:14
信誉值:2
注册日期:2009-08-13 10:23 |
|
|