任务:将实验七中的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
写这样的课程设计,先要确定思路,把大致的模块方面的设计先写出来,在慢慢细分,把握住这个过程