课程设计1(王爽)

任务:将实验七中的Power idea 公司的数据按一行四列的格式在屏幕上显示出来:

 

 

assume cs:codesg
datasg 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,97497,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
datasg ends

data segment
dw 0,0,0,0,0,0,0,0
data ends

 

;分别设计datasg和data段数据,在data段数据中实现数据向字符串转变(子程序:dtoc和dtoc_divdw)的存储ds:si指向字符串首地址

 

codesg segment
start:
mov ax,datasg
mov ds,ax
mov ax,0b800h
mov es,ax
mov si,0
mov di,0
mov cx,21               ;循环21次s0
s0:
mov bx,0
push cx                  ;保留cx,bx,di
push bx
push di
mov cx,4
s1:
mov al,[bx+si]
mov es:[di],al          ;对第一组数据(即字符串)向显存中存储,循环4次s1
mov al,7h
mov es:[di+1],al
inc bx
add di,2
loop s1
pop di                      ; 恢复di,bx
pop bx
add bx,84               ;使bx加84指向第二组数据
add di,40                ;使di加40使显存移至第二段
mov ax,[bx+si]       ;在第二组数据中低位移至ax中,高位移至dx中
mov dx,[bx+si+2]
call dtoc_divdw      ;由于第二组数据中有超过16位数据的数,当数据转为字符串时有可能除法溢出,调用dtoc_divdw子程序
add bx,84
add di,40                ;在使dx加84指向第三个数组,di加49使显存移至第三段
push si                    ;si入栈,由于第三个数组的数据类型是dw只占两个字节是前两个数组数据的一半,
mov ax,si                 ;所以要使si为原来的一半才可使每次能够正确的访问第三个数组
mov dx,0
mov cx,2
div cx
mov si,ax                ;所的一半的值存入si中
mov ax,[bx+si]        ;访问第三数组
call dtoc                   ;调用子程序dtoc(不会发生除法溢出)
pop si                      ;恢复si之前的值
push ax                   ;ax(此时为第三数组的数据)入栈为所得的第四个数组数据做准备
add di,40
mov ax,[bx-84+si]    ;访问第二数组的值
mov dx,[bx-82+si]
pop cx                      ;将第三数组的数据出栈并存入cx中
div cx                        ;第二数组数据除第三数组数据,所的商ax,余数dx并调用dtoc
call dtoc
add si,4                   
add di,40
pop cx
loop s0
mov ax,4c00h
int 21h

 

dtoc:
push cx
push si                      ;保留现场
push ds
push ax
push bx
mov si,0
change:
mov dx,0
mov bx,data             ;设置ds:si使之指向第一字符串
mov ds,bx
mov cx,10
div cx
add dl,30h
mov [si],dl              
mov cx,ax
jcxz ok
inc si
jmp short change       
ok:
call show_str           ;调用show_str
pop bx
pop ax
pop ds                     ;恢复现场
pop si
pop cx
ret

 

show_str:
push si               ;保留现场
push cx
push di
push es
push ax
inc si
mov cx,si
s2:                      ;讲字符串移至显存中
dec si
mov al,[si]
mov es:[di],al
mov al,07h
mov es:[di+1],al
add di,2
loop s2
pop ax
pop es
pop di                  ;恢复现场
pop cx
pop si
ret

 

dtoc_divdw:
push bx               ;保留现场
push ds
push cx
push ax
push dx
push si               
mov si,0               ;令si=0,为字符串存储做准备
cycle:
mov bx,data
mov ds,bx            ;在子程序中重新设置ds数据段的值,使ds:si指向字符串首地址
mov cx,10
push ax                ;除法溢出公式X/N=INT(H/N)+(REM(H/N)+L)/N
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx             ;余数保存在cx中,+30h转为字符串存于ds:si中
add cl,30h
mov [si],cl
mov cx,ax
jcxz finish
inc si                      ;si加1,使字符串个数满足子程序show_str中cx的循环次数
jmp short cycle
finish:
call show_str         ;转化完毕,调用子程序show_str,讲字符串存于显存中
pop si
pop dx
pop ax
pop cx                      ;恢复现场
pop ds
pop bx
ret
codesg ends
end start

 

 

写这样的课程设计,先要确定思路,把大致的模块方面的设计先写出来,在慢慢细分,把握住这个过程

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值