; 将字符复制到目标区并设置对应的属性
; 1、确定屏幕的中央
; 80x25模式,每行 80 个字符 (每个字符两个字节,共 160 个字节)
; 我们的目标字符串刚好 16个字节,再加上 16个字节的属性,则目标
; 字符串共需要 32 字节的空间,所以 字符应该从 (160 - 32) / 2 = 64
; 偏移下标开始。三行字符分别占屏幕 11,12,13 行。
; 2、确定三行字符的属性: 绿色: 02h, 绿底红色: 24h, 白底蓝色: 71h (根据
; 需要的颜色先求出对应的二进制,然后转 16 进制)
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends
stack segment
dw 8 dup (0)
stack ends
code segment
start:
; 表示行偏移
mov si, 0
mov di, 0
mov cx, 3
s0: ;三行循环
mov ax, stack
mov ss, ax
mov sp, 16
; 使用 ds 寄存器从 data 段取数据
mov ax, data
mov ds, ax
; 使用 es 寄存器将数据放入目标地址
mov ax, 0B800h
mov es, ax
; 取数据偏移
mov bx, 0
; 目标地址 行内水平偏移
mov bp, 0
push cx ; 外层循环入栈保护 --begin
; 依次复制 16 个字符
mov cx, 16
s1:
; 将字符复制到目标区并设置对应的属性
mov al, ds:[bx] ; al 表示
mov es:[bp + 640h + si + 64],al ; 640h = 160 * 10 对应的 16进制,即表示 11 行 - 垂直居中
; 偏移 64 字节后水平居中
mov ax, ds:[16 + di]
mov es:[bp + 1 + 640h + si + 64], ax
inc bx
add bp, 2
loop s1
pop cx ; 外层循环入栈保护 --begin
add si, 0a0h
inc di
loop s0
mov ax,4c00h
int 21h
code ends
end start
展示的效果为下图所示: