assume cs:codesg
data segment
db 'welcome to masm!'
db 2,24h,71h
data ends
stack segment
db 16 dup (0)
stack ends
codesg segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
mov si,0
mov di,0
mov bx,0
; mov ax,0b872h
mov ax,0b872h ;80*2=160字节*11行=1760(实际上是11行尾.也就是12行的开始) 因为第行80个字节,
;然后welcome to masm!是16个字节 80-16=64然后64/2 =32 然后因为每个字符要占一个字节,
;因为低位是AscII码,高位是颜色表,所以每行是160个字节,所以32*2=64=1760+64=1824 =720h
mov bp,10h
mov cx,3
s:
push cx
mov es,ax
mov dh,ds:[bp]
mov cx,16
s1:
mov dl,[bx+si]
mov es:[bx+di],dl
mov es:[bx+di].1,dh
inc si
add di,2
loop s1
inc bp
; add ax,14h 这个是隔行了
add ax,0ah ;将显存的段地址设置为当前行的下一行
;在段地址中加上0ah,相当于在偏移地址中加了0a0h(=160d)
;因为段地址要乘以16嘛
mov si,0
mov di,0
pop cx
loop s
mov ax,4c00h
int 21h
codesg ends
end start |