|
主题 : : 课程设计一,感觉代码很臃肿,大家帮忙看看 [待解决] |
回复[ 3次 ]
点击[ 354次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-11-24 16:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-07-17 17:25 |
assume cs:code
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1997','1992'
db '1993','1994','1995'
;以上数据为年份记录(21年)
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上数据为年收入记录(对应上面21年)
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258
dw 2793,4037,5635,8226,11542,14430,15257,17800
;以上数据为雇员人数(对应上面21年)
db 8 dup (0)
;定义8字节的内存空间用来存放除法所得余数
data ends
code segment
start:
mov ax,0b800h
mov ds,ax
mov ax,data
mov es,ax
mov bx,01E8H ;设定显示的起始位置为4行4列
mov si,0
mov di,0
mov cx,21
lop:
;将年份写入显示缓冲区指定位置
mov ah,71h ;设定年份显示为白底蓝字
mov al,es:[di]
mov byte ptr [bx],al
mov byte ptr [bx+1],ah
mov al,es:[di+1]
mov byte ptr [bx+2],al
mov byte ptr [bx+3],ah
mov al,es:[di+2]
mov byte ptr [bx+4],al
mov byte ptr [bx+5],ah
mov al,es:[di+3]
mov byte ptr [bx+6],al
mov byte ptr [bx+7],ah
mov dx,es:[di+86] ;取得年收入,存入DX和AX中
mov ax,es:[di+84]
call dtoc
push si
mov si,40
call show
pop si
mov dx,0
mov ax,es:[si+168] ;取得雇员人数,存入AX中
call dtoc
push si
mov si,80
call show
pop si
mov dx,es:[di+86] ;取得年收入,存入DX和AX中
mov ax,es:[di+84]
div word ptr es:[si+168]
mov dx,0
call dtoc
push si
mov si,120
call show
pop si
add bx,00a0h
add si,0002h
add di,0004h
loop lop
mov ax,4c00h
int 21h
dtoc:
push cx
push bx
push si
push di
mov si,0
mov di,0
mov cl,0
mov byte ptr es:[di+217],cl ;将最后一个内存字节空间用来存储被除数的长度
dwi:
push ax
mov ax,dx
mov dx,0
mov cx,10
div cx
mov bx,ax
pop ax
div cx
add dx,30h
push dx
inc si
mov dx,bx
mov cx,ax
inc cx ;解决当商为一,jcxz跳转
jcxz ow
loop dwi
ow:
mov cx,si
mov byte ptr es:[di+217],cl
wri:
pop dx
mov byte ptr es:[di+210],dl
inc di
loop wri
pop di
pop si
pop bx
pop cx
ret
show:
push cx
push bx
push di
mov di,0
mov ch,0
mov cl,es:[di+217]
s1:
mov al,es:[di+210]
mov [bx+si],al
mov al,04h ;将年收入设置为红字
mov [bx+si+1],al
add bx,2
inc di
loop s1
pop di
pop bx
pop cx
ret
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-11-24 20:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:12
信誉值:0
注册日期:2007-07-26 10:58 |
首先功能实现没有问题,至于优化问题,建议楼主在实现几次,就逐渐优化了 | | |
|
|
|
|
[第2楼]
[ 回复时间:2008-11-25 08:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-07-17 17:25 |
谁有代码更优化的,贴出来学习一下啊?我昨天回去又写了一遍,不知道哪里还可以精简
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;++ ++
;++ 课程设计一(完成于08/11/23,修改于08/11/25) ++
;++ ++
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
assume cs:code
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1997','1992'
db '1993','1994','1995'
;以上数据为年份记录(21年)
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上数据为年收入记录(对应上面21年)
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258
dw 2793,4037,5635,8226,11542,14430,15257,17800
;以上数据为雇员人数(对应上面21年)
db 10 dup (0)
;定义10字节的内存空间用来存放除法所得余数
data ends
code segment
start:
mov ax,0b800h
mov ds,ax
mov ax,data
mov es,ax
mov bx,01E8H ;设定显示的起始位置为4行4列
mov si,0
mov di,0
mov cx,21
lop:
;将年份写入显示缓冲区指定位置
push si
push di
push cx
mov cx,4
mov si,0
mov ah,71h ;设定年份显示为白底蓝字
wry:
mov al,es:[di]
mov byte ptr [bx+si],al
mov byte ptr [bx+si+1],ah
inc di
add si,2
loop wry
pop cx
pop di
pop si
;将年收入写入显示缓冲区指定位置
mov dx,es:[di+86] ;取得年收入,存入DX和AX中
mov ax,es:[di+84]
call dtoc
push si
mov si,40 ;取si存储显示间隔
call show
pop si
;将雇员人数写入显示缓冲区指定位置
mov dx,0
mov ax,es:[si+168] ;取得雇员人数,存入AX中
call dtoc
push si
mov si,80
call show
pop si
;将人均收入写入显示缓冲区指定位置
mov dx,es:[di+86] ;取得年收入,存入DX和AX中
mov ax,es:[di+84]
div word ptr es:[si+168]
mov dx,0
call dtoc
push si
mov si,120
call show
pop si
add bx,00a0h
add si,0002h
add di,0004h
loop lop
mov ax,4c00h
int 21h
dtoc:
push cx
push bx
push si
push di
mov si,0
mov di,0
mov word ptr es:[di+218],0 ;将最后一个内存字空间用来存储被除数的长度
dwi:
push ax
mov ax,dx
mov dx,0
mov cx,10
div cx
mov bx,ax
pop ax
div cx
add dx,30h
push dx
inc si
mov dx,bx
mov cx,ax
jcxz ow
jmp short dwi
ow:
mov cx,si
mov word ptr es:[di+218],cx
wri:
pop dx
mov byte ptr es:[di+210],dl
inc di
loop wri
pop di
pop si
pop bx
pop cx
ret
show:
push cx
push bx
push di
mov di,0
mov ah,04h ;将年收入设置为红字
mov cx,es:[di+218]
s1:
mov al,es:[di+210]
mov [bx+si],al
mov [bx+si+1],ah
add bx,2
inc di
loop s1
pop di
pop bx
pop cx
ret
code ends
end start | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-11-25 09:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:13
信誉值:0
注册日期:2008-03-09 16:31 |
mov ax,0b800h
mov ds,ax
mov ax,data
mov es,ax
------------------
一般来说我们还是习惯ds存放data ;)
可以给子程序和一些功能块加备注。
子程序也就相当于c语言中的函数,程序的逻辑清晰很大程度上在于函数的设计。尽量主程序少尽量由子程序实现功能就清晰了~
先实现了,精简的事情可以等学过两章再说 :-)
刚看了下楼主的博客,还蛮干净的,根据学习活动的内容,是要多发发作业和做检测题的~ | | |
|