;本程序只支持DOS全屏状态,DOS窗口状态下会有些小问题
assume cs:codesg,ds:data
data segment
db 'welcome to masm!'
data ends
codesg segment
start:
mov ax, data
mov ds, ax
mov si, 0
mov ax, 0B800H ;0B800H为显示缓冲区的起始地址
mov es, ax
;80是显示缓冲区一行的字符数
;24是因为我的显示器全屏DOS模式下是80*49
;64是因为要显示的字符串有16个字符,显示缓冲区一行有80个字符,要居中显示就必须先跳过32个字符
;*2是因为显示缓冲区每个字符要占2个字节
mov di, (80*24+32)*2;
mov cx, 16
s:
mov al, [si] ;低位为字符的ASCII码
mov ah, 00000010B ;高位为字符的显示属性
mov es:[di], ax ;写入显示缓冲区的相关位置
;再写两行,因为字符是同样的,al就不需要重复赋值了
mov ah, 00100100B
mov es:[di+160], ax ;增加一行就是增加160个字节
mov ah, 01110001B
mov es:[di+320], ax ;增加两行就是增加320个字节
inc si
add di, 2
loop s
mov ax, 4c00H
int 21H
codesg ends
end start |