assume ds:data,cs:codesg
data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends
codesg segment
;首先获取屏幕的中间位置,也即要写入内容的位置
;每行160个字符,也即0aH个长度,起始位置为00h
;横向:每页有25行,中间三行为12,13,14行,其中第12行的起始位置为
; 00H+0a0H*0bh( ;即0a0h相加11次得到第12行的起始位置
;纵向:每页160列,则中间6列的列位为64到95列,即起始位置为
; 00h+0a0h*0bh+040h
start:mov ax,0b800h
mov es,ax
mov cx,11
mov bx,0h
s1:add bx,0a0h
loop s1
add bx,040h
;获取数据段的段地址
mov ax,data
mov ds,ax
;将数据段中的数据写入到显存中
;写入第十一行数据,循环16次
mov si,0
mov di,0
mov cx,16
s31:mov al,[si]
mov byte ptr es:[bx+di],al
mov al,ds:[16]
mov byte ptr es:[bx+di+1],al
add di,2;
inc si
loop s31
;第一行写入完毕,写入位置增加0a0h
;同时写入第二行数据,循环16次
mov si,0
mov di,0
add bx,0a0h
mov cx,16
s32:mov al,[si]
mov byte ptr es:[bx+di],al
mov al,ds:[17]
mov byte ptr es:[bx+di+1],al
add di,2
inc si
loop s32
;第二行写入完毕,写入位置增加0a0h
;同时写入第三行数据,循环16次
mov si,0
mov di,0
add bx,0a0h
mov cx,16
s33:mov al,[si]
mov byte ptr es:[bx+di],al
mov al,ds:[18]
mov byte ptr es:[bx+di+1],al
add di,2;
inc si
loop s33
;执行完毕,退出
mov ax,4c00h
int 21h
codesg ends
end start |