题目要求:在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串 'welcome to masm!'
通过阅读教材资料我们能获取的信息如下:
1、显示器默认显示的缓冲区是:B8000~B8F9F,低字节放字符,高字节放属性
2、存放字符的地址:第一行:B8000~B809F,第二行:B80A0~B813F 第三行:B8140 ~ B81DF
3、即偶数字节放字符,奇数字节放属性
4、如何显示:只要把字符依次放入缓冲区即可
5、颜色属性怎么表示:绿色:0000 0010 (02h),绿底红字:0010 0100(24h),白底蓝字(71h)
我只写了在显示器起始处显示三行,至于在屏幕中间显示,只要加一个偏移量就好了,运行结果如下:
自己写的代码如下,请参考,不知道还能不能再优化一下:
assume cs:codesg,ds:data,ss:stack希望对跟我一样的初学者有帮助 .
data segment
db 'welcome to masm!'
db 2,24h,71h
data ends
stack segment
db 16 dup(0)
stack ends
codesg segment
start:
mov ax,stack ;定义栈,多重循环需用到栈
mov ss,ax
mov sp,0
mov ax,data ;定义数据区
mov ds,ax
mov cx,3
mov ax,0B800H ;缓冲区的第一页首地址
mov es,ax
mov si,10h ;si偏移至存储颜色的地址
mov ax,0
s:
mov ah,ds:[si] ;用ah保存字符颜色
push cx ;将cx,si入栈保存
push si
mov cx,16
mov si,0
mov bx,0
mov di,1
inputCh: ;输出一行welcome to masm!
mov al,[bx]
mov es :[bx + si],al ;写字符
mov es:[bx + di],ah ;写字符属性
inc bx ;遍历字符串
inc si
inc di
loop inputCh
pop si ;si出栈
inc si ;指向下一个颜色
pop cx
mov dx,es ;接下来三条指令将es指向下一行
add dx,0ah
mov es,dx
loop s
s1: ;最初程序执行太快,看不到现象,加一个死循环,用于看结果
jmp short s1
codesg ends
end start