DATAS SEGMENT
db 'welcome to masm!'
db 02h,24h,71h
DATAS ENDS
STACKS SEGMENT
db 16 dup(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS;设置data段
MOV DS,AX
mov ax,STACKS
mov ss,ax
mov ax,0b800h;设置显示缓存区
mov es,ax;设置显示缓存区
mov sp,10h;
mov bx,780h; ;设置显示行怎么来的780H呢
;我们要显示的是12-14三行,那么就需要在第12行开始显示,即过掉0-11,
;所以80字符*2*12=1920字节,1920换算16进制就是780h
mov si,10h;拿到颜色偏移量
mov cx,3 ;保存外循环3次,因为要输出三行
s:
;先把颜色存到ax的高地址
mov ah,ds:[si]
push si
push cx
mov cx,16
;先拿到第12行的中间位置,一行80字符=160字节,而我们的字符16个字节+颜色属性站32个字节
;160-32= 128 ,然后128/2=64,那么从64字节开始就是32字节在每行中间的开始位置
mov si,64
mov di,0
s0: ;把字符串挨个存进去
mov al,ds:[di]
mov es:[bx+si],al
mov es:[bx+si+1],ah
;mov word ptr es:[bx+si],ax ;这里可以尝试用word ptr,测试结果也是一样的
add si,2;为什么加2呢,因为一个字母加颜色属性是2个字节
add di,1
loop s0
pop cx
pop si
add si,1h
add bx,0a0h
loop s
MOV ax,4C00H
INT 21H
CODES ENDS
END START
实现图: