汇编语言-实验10编写子程序
名称:show_str
功能,在指定的位置,用指定的颜色,显示一个用0结束的字符串。
参数:(dh)行号。(dl)列号,(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:
push dx;
mov ax,0b800h
mov es,ax
mov ah,0
mov al,dh;al存放行偏移量,用于计算乘法
mov bx,160
mul bl
mov dh,0
add ax,dx
add ax,dx;偏移量乘以2才是字节数
mov bx,ax; bx存放显存偏移地址
mov si,0; 下标访问数据区
mov dh,cl; dh 存放显示颜色
s:
mov ah,dh
mov al,ds:[si]
mov es:[bx],ax
inc si
inc bx
inc bx
mov ch,0
mov cl,ds:[si]
jcxz ok
loop s
ok :pop dx
ret
code ends
end start
2.divdw
功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
参数:(ax)=dword型数据的低16位
(bx)=dword型数据的高16位
(cx)除数
提示:给出一个公式
X:被除数,范围:[0,FFFFFFFF]
N:除数,范围[0,FFFF]
H:X高16位,范围:[0,FFFF]
L:X低16位,范围:[0,FFFF]
int()描述性运算符,取商,比如,int(38/10)=3
rem():描述性运算符,取余数,比如,rem(38/10)=8
返回:(dx)=结果高16位,(ax)结果低16位
(cx)余数
公式:X/N=int(H/N)65536+[rem(H/N)65536+L]/N
assume cs:code
code segment
mov ax,4240h
mov dx,0fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
divdw: push ax
mov ax,dx
mov dx,0 ;被除数的高16位先除,所以将dx置零的原因所在
div cx ;结果低16位ax存放商,高16位dx存放余数
mov bx,ax ;商的高16位放入bx保存,因为题目要求高16位放在dx
pop ax ;恢复低16位的被除数,
div cx ;结果低16位ax存放商,高16位DX存放余数
mov cx,dx ;第一次除的结果放在dx中,第二次除默认是放在ax中
mov dx,bx ;余数存放在cx
ret
code ends
end
3.数值显示
编程,将data段中的数据以十进制的形式显示出来
data segment
dw 123,12666,1,8,3,38
data ends
ASCII码:0-9对应于30H-39H
要将数据用十进制的形式显示在屏幕上,要进行两步工作
(1)将用二进制信息存储的数据转变成十进制形式的字符串
(2)显示十进制形式的字符串。(调用show_ptr)
子程序描述:
名称:dtoc
功能:将word型数据转变为表示十进制数的字符串,字符串以0为结束符
参数(ax)=word型数据
ds:si指向字符串的首地址
返回:无
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 ;bx保存除数10(000a-16位)
div bx ;余数在dx中(余数小于除数10,dh一定为0)
;商还在ax中
add dl,30h ;dl = 十进制数码值 + 30h = 对应的ascii码值
mov ds:[si],dl ;data段中数据是逆序存放
mov cx,ax ;cx = 商
jcxz ok ;商为0则说明各位的数已全部求出
inc si
jmp short dtoc
ok:ret
show_str:
push dx;
mov ax,0b800h
mov es,ax
mov ah,0
mov al,dh;al存放行偏移量,用于计算乘法
mov bx,160
mul bl
mov dh,0
add ax,dx
add ax,dx;偏移量乘以2才是字节数
mov bx,ax; bx存放显存偏移地址
mov si,0; 下标访问数据区
mov dh,cl; dh 存放显示颜色
s:
mov ah,dh
mov al,ds:[si]
mov es:[bx],ax
inc si
inc bx
inc bx
mov ch,0
mov cl,ds:[si]
jcxz ok1
loop s
ok1 :pop dx
ret
code ends
end start
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步