要求
收集数据
颜色
所以:
绿色(默认黑底):02h
绿底红色:24h
白底蓝色:71h
确定行起点(es),行内偏移量
es位置:
25行中,让3行显示在中间,就是上下各11个空行,又因每页缓冲区为80\2\25=4000字节,显存缓冲区起点为B800,所以:
es = b800*10h 加上 802 \11 得 b800:06e0,也就是b86e的段地址
行偏移:
因为要打印的为16字符,每个字符会占2字节,就是32字节。又一行有160字节 (160-32)/2 = 64字节 = 40h
注:40h作为idata即可,
代码
assume cs:code, ds:data, ss:stack
data segment
db 'welcome to masm!'
db 02h, 24h, 71h
data ends
stack segment
dw 6 dup(0) ;申请6个word的栈空间,用于保存循环变量用
stack ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 0eh ;空栈栈顶
mov ax, 0b86eh ;要打印行的段起点
mov es, ax
mov cx, 3h ;3行
mov si, 10h ;循环颜色,ds偏移量
s1:
push cx
mov bx, 0 ;每行从头循环字符
mov cx, 10h ;内循环16次拷贝ds区域到显存缓冲区行
mov di, 0 ; 索引列
s2:
mov ax, 0
mov al, [bx]
mov ah, ds:[si]
mov es:[40h+di],ax
inc bx;
add di, 2 ;下一列需要移动2个字节
loop s2
inc si ;si切换到下1个颜色
; es切换到下一行
mov ax, es
add ax, 0ah ;+160字节到下一行,段地址需要除以16再相加
mov es, ax
pop cx
loop s1
mov ax, 4c00h
int 21h
code ends
end start