|
主题 : : 课程设计1 程序测试通过! [待解决] |
回复[ 2次 ]
点击[ 425次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-11-25 10:05 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-08 17:43 |
assume cs:codesg
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
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
huancun segment
dd 8 dup (0)
huancun ends
codesg segment
start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0
mov si,0
mov di,0
mov cx,21
r: mov ax,ds:[bx]
mov dx,ds:[bx+2]
mov es:[di],ax
mov es:[di+2],dx
mov ax,ds:[bx+84]
mov dx,ds:[bx+86]
mov es:[di+5],ax
mov es:[di+7],dx
div word ptr ds:[si+168]
mov es:[di+13],ax
mov ax,ds:[si+168]
mov es:[di+10],ax
add bx,4
add si,2
add di,16
loop r
sub si,si
mov ax,0B800H
mov ds,ax
sub ax,ax
mov ah,15
mov cx,2000
p: mov [si],ax
add si,2
loop p
sub bx,bx
sub si,si
sub di,di
mov ax,huancun
mov ds,ax
mov ax,table
mov es,ax
mov bh,3
mov bl,3
mov cx,21
z: push cx
mov ax,es:[di]
mov dx,es:[di+2]
mov ds:[0],ax
mov ds:[2],dx
mov byte ptr ds:[4],0
mov dh,bh
mov dl,bl
mov cl,15
mov si,0
call show_str
mov ax,es:[di+5]
mov dx,es:[di+7]
mov ds:[16],ax
mov ds:[18],dx
mov ax,es:[di+10]
sub dx,dx
mov ds:[20],ax
mov ds:[22],dx
mov ax,es:[di+13]
mov ds:[24],ax
mov ds:[26],dx
push bx
push di
mov di,16
mov cx,3
z1: push cx
add bl,10
mov ax,ds:[di]
mov dx,ds:[di+2]
mov cx,0AH
call divdw
mov dh,bh
mov dl,bl
mov cl,15
mov si,0
call show_str
add di,4
pop cx
loop z1
pop di
pop bx
inc bh
add di,16
pop cx
loop z
mov ax,4c00H
int 21H
divdw: push ax
push bx
push cx
push dx
push si
push di
sub di,di
d: mov bx,ax
mov ax,dx
sub dx,dx
div cx
mov si,ax
mov ax,bx
div cx
push dx
inc di
mov dx,si
push cx
mov cx,ax
jcxz d1
pop cx
jmp short d
d1: pop cx
mov cx,di
sub si,si
d2: pop bx
add bl,30H
mov byte ptr [si],bl
inc si
loop d2
mov byte ptr [si],0
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
show_str:
push dx
push cx
push ax
push si
push es
push bx
mov ax,0b800H
mov es,ax
mov al,160
dec dh
mul dh
sub dh,dh
dec dl
add dl,dl
add ax,dx
mov bx,ax
mov dl,cl
s: mov ch,0
mov cl,[si]
jcxz s1
mov ch,dl
mov es:[bx],cx
inc si
add bx,2
jmp short s
s1: pop bx
pop es
pop si
pop ax
pop cx
pop dx
ret
codesg ends
end start
多多交流 | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-11-25 21:43 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-08 17:43 |
简单注解:
程序的目的是把日期 收入 员工 人均收入 按一定的格式显示在屏幕上,本程序为了简洁没有设置栈(栈用系统栈空间)。
assume cs:codesg
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
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
huancun segment
dd 8 dup (0)
huancun ends
codesg segment
start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0
mov si,0
mov di,0
mov cx,21
r: mov ax,ds:[bx]
mov dx,ds:[bx+2]
mov es:[di],ax
mov es:[di+2],dx
mov ax,ds:[bx+84]
mov dx,ds:[bx+86]
mov es:[di+5],ax
mov es:[di+7],dx
div word ptr ds:[si+168]
mov es:[di+13],ax
mov ax,ds:[si+168]
mov es:[di+10],ax
add bx,4
add si,2
add di,16
loop r
这段程序是把 日期 收入 员工 人均收入 计算好后存储在预设的空间,直接用我实验7写的程序。
----------------------------------------------------------------------------------
sub si,si
mov ax,0B800H
mov ds,ax
sub ax,ax
mov ah,15
mov cx,2000
p: mov [si],ax
add si,2
loop p
这段是清屏, 把整个屏幕变成黑色。
----------------------------------------------------------------------
sub bx,bx
sub si,si
sub di,di
mov ax,huancun
mov ds,ax
mov ax,table
mov es,ax
mov bh,3
mov bl,3
mov cx,21
z: push cx
mov ax,es:[di]
mov dx,es:[di+2]
mov ds:[0],ax
mov ds:[2],dx
mov byte ptr ds:[4],0
mov dh,bh
mov dl,bl
mov cl,15
mov si,0
call show_str
mov ax,es:[di+5]
mov dx,es:[di+7]
mov ds:[16],ax
mov ds:[18],dx
mov ax,es:[di+10]
sub dx,dx
mov ds:[20],ax
mov ds:[22],dx
mov ax,es:[di+13]
mov ds:[24],ax
mov ds:[26],dx
push bx
push di
mov di,16
mov cx,3
z1: push cx
add bl,10
mov ax,ds:[di]
mov dx,ds:[di+2]
mov cx,0AH
call divdw
mov dh,bh
mov dl,bl
mov cl,15
mov si,0
call show_str
add di,4
pop cx
loop z1
pop di
pop bx
inc bh
add di,16
pop cx
loop z
mov ax,4c00H
int 21H
这段是主程序,关键是对子程序的重复调用,注意子程序的入口的数据设置。
---------------------------------------------------------------------
divdw: push ax
push bx
push cx
push dx
push si
push di
sub di,di
d: mov bx,ax
mov ax,dx
sub dx,dx
div cx
mov si,ax
mov ax,bx
div cx
push dx
inc di
mov dx,si
push cx
mov cx,ax
jcxz d1
pop cx
jmp short d
d1: pop cx
mov cx,di
sub si,si
d2: pop bx
add bl,30H
mov byte ptr [si],bl
inc si
loop d2
mov byte ptr [si],0
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
子程序,目的是16进制转换成10进制后在加30H转变成ASCII码后存储在指定的位置后在后面加一个零。
---------------------------------------------------------------------------------
show_str:
push dx
push cx
push ax
push si
push es
push bx
mov ax,0b800H
mov es,ax
mov al,160
dec dh
mul dh
sub dh,dh
dec dl
add dl,dl
add ax,dx
mov bx,ax
mov dl,cl
s: mov ch,0
mov cl,[si]
jcxz s1
mov ch,dl
mov es:[bx],cx
inc si
add bx,2
jmp short s
s1: pop bx
pop es
pop si
pop ax
pop cx
pop dx
ret
子程序:入口dh列dl行cl色目的把ds指定的数据显示在指定的位置,数据后加零程序遇零结束。
--------------------------------------------------------------------------------
大家看一下还有优化的地方不 ,多多交流 | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-11-27 14:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-06-01 22:23 |
assume cs:code,es:table,ss:stack
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982'
db '1983','1984','1985','1986','1987','1988','1989','1990'
db '1991','1992','1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486
dd 50065,97479,140417,197514,345980,590827,803530,1183000
dd 1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220
dw 476,778,1001,1442,2258,2793,4037,5635
dw 8226,11542,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
stack segment
db 32 dup(0)
stack ends
mid segment
db 32 dup(0)
mid ends
code segment
start:mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov ax,stack
mov ss,ax
mov sp,32
mov bx,0
mov si,0
mov di,0
mov cx,21
s0:push ds:[si]
pop es:[bx]
push ds:[si+2h]
pop es:[bx+2h]
mov byte ptr es:[bx+4h],0
mov ax,ds:[si+54h]
mov es:[bx+5h],ax
mov dx,ds:[si+56h]
mov es:[bx+7h],dx
push ds:[di+0a8h]
pop es:[bx+0ah]
div word ptr es:[bx+0ah]
mov es:[bx+0dh],ax
add si,4
add di,2
add bx,16
loop s0 ;制成表格
time: mov ax,0
mov bx,0
mov cx,0
mov dx,0
mov ds,ax
mov es,ax
mov ax,table
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,32
mov si,0
mov di,0
mov cx,21
mov dh,3
year:mov dl,3
push cx
mov cl,7
call show_str
add si,16
inc dh
pop cx
loop year ;年份显示
money: mov ax,0
mov bx,0
mov cx,21
mov dx,0
mov si,0
mov di,5
mov ax,mid
mov ds,ax
mov ax,table
mov es,ax
mov dh,3
summ:mov dl,15
push cx
push dx
mov ax,es:[di]
mov dx,es:[di+2]
call dtoc
pop dx
mov cl,7
call show_str
inc dh
add di,16
pop cx
loop summ ;总收入显示
people: mov bx,0
mov cx,21
mov dx,0
mov si,0
mov di,0ah
mov ax,mid
mov ds,ax
mov ax,table
mov es,ax
mov dh,3
num:mov dl,30
push cx
push dx
mov ax,es:[di]
mov dx,0
call dtoc
pop dx
mov cl,7
call show_str
inc dh
add di,16
pop cx
loop num ;人数显示
average:mov bx,0
mov cx,21
mov dx,0
mov si,0
mov di,0dh
mov ax,mid
mov ds,ax
mov ax,table
mov es,ax
mov dh,3
aver:mov dl,45
push cx
push dx
mov ax,es:[di]
mov dx,0
call dtoc
pop dx
mov cl,7
call show_str
inc dh
add di,16
pop cx
loop aver ;平均收入显示
mov ax,4c00h
int 21h
show_str: ;功能:在指定位置,用指定颜色,显示一个用0结束的字符串
;参数:dh=行号,dl=列号,cl=颜色,ds:si指向字符串首地址
;返回:无
push ax
push bx
push cx
push dx
push es
push si
push di
mov ax,0b800h
mov es,ax
dec dh
dec dl
add dl,dl
mov ah,0
mov al,0a0h
mul dh
mov dh,0
add ax,dx
mov bx,ax
mov dl,cl
show_str1:
mov cl,ds:[si]
mov ch,0
jcxz returnshow_str
mov ch,dl
mov es:[bx],cx
inc si
add bx,2
jmp show_str1
returnshow_str:
pop di
pop si
pop es
pop dx
pop cx
pop bx
pop ax
ret
dtoc: ;功能:将dword型数据转换成十进制字符串,以0为结束符
;参数:ax=dd低16位,dx=dd高16位,ds:si指向转换后字符串首地址
;返回:无
push ax
push bx
push cx
push dx
push es
push si
dtoc_1:
mov cx,0ah
call divdw
add cx,30h
push cx
mov cx,dx
jcxz dtoc_2
dtoc_2:
mov cx,ax
jcxz dtoc_3
jmp dtoc_1
dtoc_3:
mov si,0
dtoc_4:
pop ds:[si]
mov cx,[si]
mov ch,0
jcxz returndtoc
inc si
jmp dtoc_4
returndtoc:
mov si,0
pop es
pop dx
pop cx
pop bx
pop ax
ret
divdw: ;功能:进行不产生溢出的除法
;参数:ax=dd低16位,dx=dd高16位,cx=除数
;返回:ax=结果低16位,dx=结果高16位,cx=余数
push bx
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
pop bx
ret
code ends
end start | | |
|