实验一:显示字符串 在指定的位置,用指定的颜色,显示一个用0 结束的字符串
参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79)
返回:无
思路: 计算显示字符开始处的 位置 第几行第几列 加上基础地址 然后逐个字符进行赋值
问题一:
出现了 must be index or base register 因为使用寄存器相对寻址,只能采用bx,bp,si或di
不能使用dx
assume cs:code
;显示字符串
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79) (cl)=颜色 ds:si指向字符串的首地址
;返回: 无
;应用举例:在屏幕的8行3列,用绿色显示data段的字符串
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 di,0
call show_str
mov ax,4c00h
int 21h
show_str:push dx
push cx
push di
mov ax,0b800h
mov es,ax
mov al,160
dec dh ;从前一行末尾算起
mul dh ;将乘积结果保存在ax中
add dl,dl ;修改了dx
add al,dl ;因为es中的地址是从双地址内存开始的
mov bx,ax ;地址参数赋值给bx
mov al,cl ;颜色参数赋值给al
s: mov cl,ds:[di] ;开始进行字母赋值 修改了cx
mov ch,0
jcxz ok
mov

这篇博客介绍了汇编语言实验中遇到的两个问题:一是如何在显示字符串时处理寄存器限制,二是如何解决除法溢出问题。针对溢出问题,提出了将32位数据的dx或16位ah通过除法运算削减数值的解决方案。实验三讨论了如何将十进制数转换为ASCII码串,并提出了利用除法和余数判断循环结束的方法。
最低0.47元/天 解锁文章
1328

被折叠的 条评论
为什么被折叠?



