荣誉值:0
信誉值:2
注册日期:2009-07-06 17:12 |
我在做课程设计1时找不到头绪,非常烦闷,书也看不下去了,甚至想过要把汇编放弃.还好我并没有这么做.看到别人做出设计的那种高兴劲我更加的怀疑是不是自己智商比别人低呢?然后我专门找了著名的德国智商测验来做,结果是125分,成绩还不错,但是还是一看书就头疼,我就先把汇编放了几天,结果越放越懒,连笔记都不想翻了.后来我意识到不能这样半途而废,硬着头皮又看了起来.经过几天的休息,我感觉心情没那么烦燥了,于是我从网上把几个高手的答案复制到了自己的电脑上,分析他们的代码.结果是越看越不懂.一会出现一个跳转一会一个CALL,搞的我又没有耐性了.我静下心来,自己分析了一下难住自己的地方,原来是那个转换字符串的子程序令我陷入了困境.然后我就把高手的代码生成程序,专门调试转换字符串这个子程序,终于弄明白了是怎么一个流程,然后自己就试着编了编类似的小程序,此时我的信心又回来了.借着这个动力,我又开始从新考虑解决问题的思路.由于以前有过VB基础,在做子程序的时候就稍微了解一些.功夫不负有心人,经过努力,我成功的完成了课设1,当看到四排绿色的数字整齐的排列在DOS窗口中,我太激动了.更加深了我对专家喊话区那句话的坚信程度.所以希望有过和我类似经历,或者目前仍没有做出设计的朋友,能够坚持一下,胜利的大门永远为你我敞开.下面是我的程序,用了四个循环,想法很简单,就是将四列一列一列的输出,没有另辟内存存储转换的字符什么的,都是直接写入的显存,请各位指点.
assume cs:a,ds:b,ss:d
b 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'
;以上是表示21年的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年公司收入的21个dword数据
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;以上是表示公司21年雇员人数的21个字型数据
b ends
d segment
dd 100 dup (0)
d ends
a segment
start: mov ax,b
mov ds,ax
mov ax,0b800h
mov es,ax
mov ax,d
mov ss,ax
mov sp,400
mov bx,0;此为年份地址
mov si,84;此为收入地址
mov di,168;此为人员数量地址
mov bp,0;显存行地址
;首先进行21次循环,以将年份存入显存中
mov cx,21
v: mov al,[bx+0]
mov ah,[bx+1]
mov dl,[bx+2]
mov dh,[bx+3]
call xienianfen;写年份子程序
add bx,4
loop v
mov bp,0
mov cx,21
mov bx,84
mov si,0
s1: mov ax,[bx+si]
mov dx,[bx+si+2]
push si
mov si,40
call zhuanhuan
pop si
add si,4
loop s1
mov cx,21
mov bp,0
mov bx,168
s2: mov ax,[bx]
mov dx,0
push si
mov si,80
call zhuanhuan
pop si
add bx,2
loop s2
mov cx,21
mov bp,0
mov bx,84
push cx
mov di,168
mov si,0
s3: push cx
mov ax,[bx+si+0]
mov dx,[bx+si+2]
mov cx,[di]
push si
mov si,120
call pingjun
pop si
pop cx
add di,2
add si,4
loop s3
mov ax,4c00h
int 21h
xienianfen:
push bx
push si
push di
push ax
mov si,0
pop ax
mov byte ptr es:[bp+0],al
mov byte ptr es:[bp+1],2
mov byte ptr es:[bp+2],ah
mov byte ptr es:[bp+3],2
mov byte ptr es:[bp+4],dl
mov byte ptr es:[bp+5],2
mov byte ptr es:[bp+6],dh
mov byte ptr es:[bp+7],2
add bp,0A0h
pop di
pop si
pop bx
ret;存取完毕,返回call xienianfen
zhuanhuan:
;转换字符串子程序
;参数:除数,cx;被除数,dx和ax
push cx
push bx
mov bx,0
push bx
p1: push ax
mov cx,10
mov ax,dx
mov dx,0
div cx
mov bx,ax;存储商
pop ax
div cx
add dx,30h;存储余数
push dx
mov dx,bx
mov cx,dx
add cx,ax
jcxz p
jmp short p1
p:;写入显存子程序
;参数:行地址:bp
;列地址:si
t1: pop cx
jcxz t
mov ch,2
mov es:[bp+si],cl;将收入低字节写入显存中
mov es:[bp+si+1],ch;写入绿色字体
add si,2
jmp short t1
t:
pop bx
pop cx
add bp,0a0h
ret;返回call zhuanhuan
pingjun:
;这个子程序用来求平均值
;参数:除数:雇员数1个字,用cx表示,被除数两个字,用DX和AX表示
push bx
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov dx,0
pop bx
call zhuanhuan;转换为字符串
ret;返回call pingjun
a ends
end start | | |