assume cs:codesg
data segment
db 'welcome to masm!'
db 02H,24H,71H ;字符显示的属性值
data ends
stack segment
db 16 dup (0)
stack ends
codesg segment
start: ;初始化data数据段,es:di指向data
mov ax,data
mov es,ax
mov di,0
;初始化显示缓冲区,ds:bx指向显示缓冲区。
mov ax,0b800H
mov ds,ax
;25行取中是12、13、14行,80列取中开始是61列
;12行的偏移量是12*160=1920
;总偏移量为(偏移地址)1920+60=1980
mov bx,1980
;字符的属性在数据段中的偏移量
mov si,16
;建栈,并初始化栈顶,熟悉栈结构。
;其实这里都不用人工建栈,有系统自动的。
mov ax,stack
mov ss,ax
mov sp,16
mov cx,3 ;计数器初始化为3(循环显示3次)
s: push cx ;入栈保护CX,在stack中
mov cx,16 ;内循环为16次,16个字符
output: ;将字符写入显存中
mov al,es:[di]
mov [bx],al
;将字符属性写入显存中
mov ah,es:[si]
mov [bx+1],ah
inc di
add bx,2
loop output
;每行输出的偏移量为128字节
add bx,128
mov di,0
inc si
pop cx ;出栈恢复cx计数器值
loop s
mov ax,4c00H
int 21H
codesg ends
end start
data segment
db 'welcome to masm!'
db 02H,24H,71H ;字符显示的属性值
data ends
stack segment
db 16 dup (0)
stack ends
codesg segment
start: ;初始化data数据段,es:di指向data
mov ax,data
mov es,ax
mov di,0
;初始化显示缓冲区,ds:bx指向显示缓冲区。
mov ax,0b800H
mov ds,ax
;25行取中是12、13、14行,80列取中开始是61列
;12行的偏移量是12*160=1920
;总偏移量为(偏移地址)1920+60=1980
mov bx,1980
;字符的属性在数据段中的偏移量
mov si,16
;建栈,并初始化栈顶,熟悉栈结构。
;其实这里都不用人工建栈,有系统自动的。
mov ax,stack
mov ss,ax
mov sp,16
mov cx,3 ;计数器初始化为3(循环显示3次)
s: push cx ;入栈保护CX,在stack中
mov cx,16 ;内循环为16次,16个字符
output: ;将字符写入显存中
mov al,es:[di]
mov [bx],al
;将字符属性写入显存中
mov ah,es:[si]
mov [bx+1],ah
inc di
add bx,2
loop output
;每行输出的偏移量为128字节
add bx,128
mov di,0
inc si
pop cx ;出栈恢复cx计数器值
loop s
mov ax,4c00H
int 21H
codesg ends
end start