编写子程序
一、 实验目的
巩固前面所学知识,编写三个子程序:显示字符串,解决除法溢出的问题,数值显示。
二、 实验内容或主要代码
- 子程序名称:show_str
功能:在屏幕的指定位置,用指定颜色,显示一个用0结尾的字符串
参数:(dh)=行号(取值范围0-24),dl=列号(取值范围0-79),
(cl)=颜色,ds:si:字符串的首地址
返回:无
应用举例:在屏幕的第8行3列,用绿色显示data段中的字符串。
assume cs:code
data segment
db ‘welcome to masm!’,0
data ends
code segment
start: mov dh,8
mov dl,3
mov cl,2
mov ax,data
mov ds,ax
mov si,0
call show_str
mov ax,4c00h
int 21h
show_str:
?
code ends
end start - 名称:divdw
功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
参数:(ax) = dword型数据的低16位,(dx) = dword型数据的高16位,(cx)= 除数
返回:(dx) = 结果的高16位,(ax)= 结果的低16位,(cx) = 余数
应用举例:计算1000000/10(F4240H/0AH)
mov ax, 4240H
mov dx, 000FH
mov cx, 0AH
call divdw
结果:(dx) =0001H,(ax) = 86A0H,(cx) = 0 - 编程,将data段中的数据以十进制的形式显示出来。
data segmemt
dw 123, 12666,1, 8, 3, 38
data ends
子程序描述
名称:dtoc
功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符。
参数:(ax) = word型数据,ds:si指向字符串的首地址。
返回:无
应用举例:编程,将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来。在显示时调用本次实验中的第一个子程序show_str。
assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start: mov ax,12666
mov bx,data
mov ds,bx
mov si,0
calldtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
……
code ends
end start
三、 实验结果或截图
- assume cs:code
data segment
db ‘welcome to masm!’,0
data ends
code segment
start: mov dh,8
mov dl,3
mov cl,2
mov ax,data
mov ds,ax
mov si,0
call show_str
mov ax,4c00h
int 21h
show_str:mov ax,0b800h
mov es,ax
mov al,cl
mov bp,0
mov ch,0
mov cl,dh
s0:add bp,160
loop s0
mov di,0
mov ch,0
mov cl, dl
s1:add di,2
loop s1
s2:mov cl,ds:[si]
jcxz s3
mov es:[bp+di],cl
inc di
mov es:[bp+di],al
inc di
inc si
loop s2
s3:ret
code ends
end start
2. assume cs:code
code segment
start:mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
divdw:mov bx,ax
mov ax,dx
mov dx,0
div cx
mov si,ax
mov ax,bx
div cx
mov cx,dx
mov dx,si
ret
code ends
end start
经过数次追踪后:
3. assume cs:code
data segment
db 10 dup(0)
data ends
code segment
start:mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:mov dx,0
mov bx,10
s:div bx
mov cx,ax
jcxz s0
add dx,30h
mov ds:[si],dl
inc si
mov dx,0
mov cl,2
loop s
s0:mov ds:[si],dl
mov si,0
ret
show_str:mov ax,0b800h
mov es,ax
mov al,cl
mov bp,0
mov ch,0
mov cl ,dh
s1:add bp,160
loop s1
mov di,0
mov ch,0
mov cl,dl
s2:add di,2
loop s2
s3:mov cl,ds:[si]
jcxz s4
mov es:[bp+di],cl
inc di
mov es:[bp+di],al
inc di
inc si
loop s3
s4:ret
code ends
end start
四、 实验分析或体会
此次实验结合了许多所学知识点,通过此次实验,我巩固了所学知识,如编写通用子程序来实现显示字符串、数据功能,并且可灵活的决定显示的位置(行、列)、内容和颜色。当CPU执行div错误时可能会发生除法溢出的问题,可通过设计子程序来解决。将二进制信息转化为十进制形式的字符串也是常用的功能,也可将其编写为通用子程序。掌握这些方法,可以运用到后续学习中。