题目:
1、屏幕中间,显示3行‘welcome to masm!’;
2、黑底绿字、绿底红字、白底蓝字
思路:
1、确定data段的数据内容,‘welcome to masm!’,‘02h,24h,71h’,将数据写入显存
2、确定写入地址:
1、行:B800:0000第一行第一个字,每行160字节,满屏幕25行,确认行号(25-3)/2=11,即从第12
行开始显示内容,16012=0780H,开始写入的地址为B8780H(第12行)。
2、列:00-01为第一列,满屏80列,确认列号(80-16)/2=32,即从第32列(322-2=62 3eh)开始写入W…
3,、整合一下,起始地址:B800:07be 第一行(B87beH)
B80a:07be 第二行(B885eH)
B814:07be 第三行(B88feH)
固定了偏移地址的起始位置,在循环中改变段地址的位置;
3、使用loop语句来写入内存,外层cx=3,内层cx=16(字符串长度);
代码
assume cs:code,ds:data
data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends
code segment
start: mov ax,data
mov ds,ax
mov bp,0b800h
mov es,bp
mov si,0
mov dx,0
mov bx,0
mov di,0
mov cx,3
s: mov dx,cx
mov cx,16
s0: mov al,ds:[bx]
mov es:[bx+7beh+di],al //写入字符串,因为需要占用两个字节,所以一个变量不够,【bx+bx+64】
编译器不认,所以新增一个di变量来定位
mov al,ds:[si+16] //data段的第16个字节开始是字体颜色,
mov es:[bx+7bfh+di],al //定位字符属性,在字符的后一位,字符+64,属性+65
inc di
inc bx
loop s0
mov bx,0 //因为选择的是固定偏移地址,所以需要重置偏移地址变量
mov di,0
inc si //外循环来改变每行的字体属性
add bp,0ah //用bp来改变段地址,实现换行
mov es,bp
mov cx,dx
loop s
mov ax,4c00h
int 21h
code ends
end start
dos-box结果

乱七八糟没解决的问题
1、【bx+bx+64】不可以这样用
2、改用栈段写一次,除了寄存cx外,还可以保存段地址能省一个寄存器,有时间可以尝试将段地址push后恢复,然后add后再push,目前不明白好处在哪里,就觉得挺麻烦的。
3、add,sub不可以访问段寄存器
这篇博客详细记录了使用汇编语言在屏幕上显示3行'welcome to masm!'的实验过程,包括设置黑底绿字、绿底红字、白底蓝字的颜色。博主探讨了确定数据段、计算屏幕地址的方法,并分享了遇到的问题,如不可用的指令组合和对栈段的尝试使用。
617

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



