|
主题 : : 最少行数 课设一答案闪亮登场,思路明确,结构清晰,欢迎拍砖!!!!!! [待解决] |
回复[ 6次 ]
点击[ 551次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-01-12 21:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2008-05-08 23:42 |
今天真是高兴啊,搞了差不多一个星期,当中一个难点就是突破不了,那个急啊,真是怀疑自己的智商是不是有问题,今天换了个思路,终于突破了。 哈哈哈哈,爽了!!!!!!!!!!!!!!!!!
table 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
table ends
stack segment
dw 16 dup(0)
stack ends
code segment
start: mov ax,table
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,32
mov ax,0b800h
mov es,ax
mov bx,80*2*2+3*2 ;显示年份
mov cx,21
mov si,0
s2:mov ax,[si]
mov dx,[si+2]
mov es:[bx+0],al
mov es:[bx+2],ah
mov es:[bx+4],dl
mov es:[bx+6],dh
add si,4
add bx,160
loop s2
mov cx,21 ;显示营业额
mov bp,80*2*2+25*2
mov si,84
s3:push cx
mov ax,ds:[si+0]
mov dx,ds:[si+2]
add si,4
push si
call dwdtoc
pop si
pop cx
loop s3
mov bp,80*2*2+40*2 ;显示人数
mov cx,21
mov si,168
s4: mov ax,ds:[si]
mov dx,0
add si,2
push cx
push si
call dwdtoc
pop si
pop cx
loop s4
mov bp,80*2*2+60*2 ;显示人均
mov cx,21
mov si,84
mov di,168
s5:push cx
mov ax,ds:[si+0]
mov dx,ds:[si+2]
mov cx,ds:[di]
add si,4
add di,2
push di
push si
call divdw
call dwdtoc
pop si
pop di
pop cx
loop s5
mov ax,4c00h
int 21h
dwdtoc:mov di,0 ;双字数字转字符串子程序 ax低位,dx高位
mov si,0
s:mov cx,10
call divdw
inc di
add cx,30h
push cx ;数字转换成字符串后连续进栈
push ax
add ax,dx ;判断高位低位之和是否为零 ,也就是商是否为零
mov cx,ax
pop ax
jcxz ko
jmp short s
ko:mov cx,di
mov si,0
s1: pop ax
mov es:[bp+si],al
mov byte ptr es:[bp+si+1], 03h
add si,2
loop s1
add bp,160
ret
divdw:push ax ;不会溢出的除法。参数:ax低位,dx高位,cx除数
push dx ;返回值ax低位,dx高位,cx余数
pop ax
mov dx,0
div cx
pop bx
push ax
mov ax,bx
div cx
mov cx,dx
pop dx
ret
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-01-13 20:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01 |
|
|
|
|
|
[第2楼]
[ 回复时间:2009-01-28 21:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:35
信誉值:44
注册日期:2008-09-03 21:36 |
|
|
|
|
|
[第3楼]
[ 回复时间:2009-04-28 17:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-17 21:27 |
楼主为什么不用前边写过的show_str子函数来显示数据呢?这个课程设计1不是想考我们子程序的应用吗? | | |
|
|
|
|
[第4楼]
[ 回复时间:2009-04-29 12:34 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2008-05-08 23:42 |
感谢这位朋友的提问,这个问题也是我的不足的地方。本来是准备调用显示程序,但是调用的时候要设置行、列的数值,占用了很多寄存器。而为了保存这些寄存器的值,又得使用栈。非常麻烦。当时为了突破设计一,什么也不顾了,就将显示程序放在双字数字转字符串子程序的后面,没有单独列出来。总之,能把结果做出来是硬道理。以后再来优化吧。再次感谢你!!! | | |
|
|
|
|
[第5楼]
[ 回复时间:2009-04-30 18:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-30 18:40 |
也把我的贴上,希望能有朋友给我也指导下.
assume cs:code,ds:data,es:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479
dw 3,7,9,13,28,38,130,220,476,778
data ends
table segment
db 160 dup (0)
table ends
code segment
start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov si,0
mov bx,0
mov di,0
mov cx,10
S:
mov al,[bx]
mov es:[di],al
mov al,[bx+1]
mov es:[di+1],al
mov al,[bx+2]
mov es:[di+2],al
mov al,[bx+3]
mov es:[di+3],al
;把年份写入
mov ax,28H[bx]
mov dx,2aH[bx]
mov es:5H[di],al
mov es:6H[di],ah
mov es:7H[di],dl
mov es:8h[di],dh
div word ptr ds:50H[si]
mov es:0dH[di],al
mov es:0eh[di],ah
;算出人平均值
;把年收入写入,并算出平均值写入
mov ax,50H[Si]
mov es:0bH[di],al
mov es:0cH[di],ah
;把人数写出
add di,16
add bx,4
add si,2
loop S
mov ax,4c00H
int 21H
code ends
end start | | |
|
|
|
|
[第6楼]
[ 回复时间:2009-04-30 18:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-30 18:40 |
这是另一个改进的
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479
dw 3,7,9,13,28,38,130,220,476,778
data ends
table segment
dw 80 dup (0)
table ends
code segment
start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov si,0
mov bx,0
mov di,0
mov cx,10
S:
mov ax,[bx]
mov es:[di],ax
mov ax,[bx+2]
mov es:[di+2],ax
;把年份写入
mov ax,28H[bx]
mov dx,2aH[bx]
mov es:5H[di],ax
mov es:7H[di],dx
div word ptr ds:50H[si]
mov es:0dH[di],ax ;把年收入写入,并算出平均值写入
mov ax,50H[Si]
mov es:0bH[di],ax ;把人数写出
add di,16
add bx,4
add si,2
loop S
mov ax,4c00H
int 21H
code ends
end start | | |
|