王爽 汇编语言第二版 实验9 根据材料编程 代码及分析

时间:2021-10-20 12:09:20

          题目要求:在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串 'welcome to masm!'


          通过阅读教材资料我们能获取的信息如下:
   1、显示器默认显示的缓冲区是:B8000~B8F9F,低字节放字符,高字节放属性
     2、存放字符的地址:第一行:B8000~B809F,第二行:B80A0~B813F 第三行:B8140 ~ B81DF
   3、即偶数字节放字符,奇数字节放属性
           4、如何显示:只要把字符依次放入缓冲区即可
           5、颜色属性怎么表示:绿色:0000 0010 (02h),绿底红字:0010 0100(24h),白底蓝字(71h)

          我只写了在显示器起始处显示三行,至于在屏幕中间显示,只要加一个偏移量就好了,运行结果如下:

 王爽 汇编语言第二版 实验9 根据材料编程 代码及分析



自己写的代码如下,请参考,不知道还能不能再优化一下:

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
希望对跟我一样的初学者有帮助 .