本人学习王爽老师的汇编原理有一段时间,以下是课程设计1的代码,希望能与各位学友一同探讨,一同进步。
assume cs:code
data segment
dd 1975,1976,1977,1978,1979,1980,1981,1982,1983
dd 1984,1985,1986,1987,1988,1989,1990,1991,1992
dd 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
data ends
temp segment
db 10 dup(0)
temp ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,temp ;暂存已分离数字的数据段
mov ss,ax
mov si,0
mov di,0
mov bx,0
mov bp,168
mov cx,21
mov dh,1
mov dl,1
s:
push cx ;保存循环次数
push dx ;保存屏幕显示的行数和列数
mov ax,ds:[si]
mov dx,ds:[si+2] ;开始读取年份的数据,由于是double word,存取年份的内存占4个字节
call ddtoc ;调用ddtoc子程序
;该程序能将内存中的dd型数据转变为表示十进制数的字符串
mov cl,2 ;设定字体的前景和背景色
pop dx ;设定显示字体的行数和列数
call show_str ;调用显示字符串的子程序
add dl,10
push dx
mov ax,ds:[si+84]
mov dx,ds:[si+86]
call ddtoc
mov cl,2
pop dx
call show_str
add dl,12
push dx
mov ax,ds:[bp]
mov dx,0
call ddtoc
mov cl,2
pop dx
call show_str
add dl,10
push dx
mov ax,ds:[si+84]
mov dx,ds:[si+86]
mov cx,ds:[bp]
call divdw
call ddtoc
mov cl,2
pop dx
call show_str
inc dh
mov dl,1
add si,4
add bp,2
pop cx
loop s
mov ax,4c00H
int 21H
ddtoc: ;将dword型数据转变为表示十进制数的字符串,
;字符串以0为结尾符
a: push si
push bx
push ax
push cx
push dx
mov si,0
b: ;算法思想:通过不断除以10,将所得的余数不停入栈,
mov cx,10 ;就能将该数据的每一数字分离出来
call divdw
add cx,30H
push cx
mov bx,ax
or ax,dx
mov cx,ax
mov ax,bx
jcxz c
mov cx,0
inc si
jmp short b
c: mov cx,si
inc cx
mov si,0
d:pop ax
mov ss:[si],al
inc si
loop d
mov byte ptr ss:[si],0
mov si,0
pop dx
pop cx
pop ax
pop bx
pop si
ret
show_str: ;该子程序能在指定的位置,用指定的颜色,
push si ;显示一个用0结束的字符串
push ax ;参数:(dh)=行号(取值范围1-25),
push bx ;(dl)=列号(取值范围1-80),(cl)=颜色
push dx
push di
mov ax,0B800H
mov es,ax
mov bx,0
mov ch,0
mov di,0
sub dh,1
mov al,0A0H
mul dh
mov bx,ax
sub dl,1
mov al,2
mul dl
mov di,ax
mov al,cl
mov ch,0
mov si,0
display: mov cl,ss:[si] ;从暂存数据段 读取数据,逐一写入显存.
jcxz ok ;如果读取到0,就停止读取数据
mov es:[bx+di],cl
mov es:[bx+di+1],al
inc si
add di,2
jmp short display
ok :pop di
pop dx
pop bx
pop ax
pop si
ret
divdw: push ax ;该程序 能进行不会产生溢出的除法运算,
;被除数为dword,除数为word,结果为dword
mov ax,dx ;参数(ax)=dword型数据的低16位,
;参数(dx)=dword型数据的高16位,(cx)=除数
mov dx,0 ;返回(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
ret
mov ax,4c00H
int 21H
code ends
end start