题目要求
编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串’welcome to masm!’。
解题代码
写出一个颜色的代码后,另外两个只需要修改一下字体属性即可完成题目要求。 =_=
书中关于属性的参考
内存地址中,B8000H~BFFFFH共32kb的空间,是80×25彩色字符模式的显示缓冲区,所以在这个地址空间写入数据,数据的内容将立即出现在显示器上。
在一页的显示缓冲区中:
偏移000~09F对应显示器上的第一行(80个字符占160个字节)
偏移0A0~13F对应显示器上的第二行
偏移140~1DF对应显示器上的第三行
一行中:
00~01单元对应显示器上的第一列
02~03单元对应显示器上的第二列
04~05单元对应显示器上的第三列
以此类推
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
闪烁 | 红 | 绿 | 蓝 | 高亮 | 红 | 绿 | 蓝 |
其中6,5,4是背景; 2,1,0是前景。
所以可以得到我们的代码
assume cs:code ;定义段,代码段,数据
;数据段
data segment
db 'welcome to masm!'
data ends
;代码段
;stack segment ;可有可无
; db 16 dup(0)
;stack ends
code segment
start:
;手动设置ds
mov ax,data
mov ds,ax
;设置显示缓冲区,用es来设置,向es记录的内润的hi之中写入数据,即可显示在dos控制台中
mov ax,0B800h
mov es,ax
;初始化si和di,si只想要复制的字符,di指向目的空间
mov si,0
mov di,10*160+60 ;也可以写1660
;设置循环次数
mov cx,16
s1:mov al,ds:[si];设置字符
mov ah,00000010b;设置显示属性
mov es:[di],ax
inc si
inc di
inc di
loop s1
mov si,0
mov di,12*160+60
mov cx,16
s2:mov al,ds:[si];设置字符
mov ah,00100100b;设置显示属性
mov es:[di],ax
inc si
inc di
inc di
loop s2
mov si,0
mov di,14*160+60
mov cx,16
s3:mov al,ds:[si];设置字符
mov ah,01110001b;设置显示属性
mov es:[di],ax
inc si
inc di
inc di
loop s3
;正常结束
mov ax,4c00h
int 21h
code ends
end start