assume cs:codesg
data segment
db 'welcome to masm!'
data ends
codesg segment
start:mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov si,0
mov bx,0
mov cx,16
s0:
mov al,ds:[bx]
mov ah,02h
mov es:[si+720h],ax
mov ah,24h
mov es:[si+7c0h],ax
mov ah,71h
mov es:[si+860h],ax
inc bx
add si,2h
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
这实验完成的思路:ASCII码和属性放到屏幕的中间也就是11,12,13行(屏幕总共有25行),11行的地址是b8000+(11行*160字节在转成16进制就是6E0),因为一行有80个字符,我们要16个字符放中间也就是前面要有32个字符就是64个字节,所以11行的地址就是b8000+6e0+40=b8720,然后12,13行同理就多个A0就好,这题一开始我用就用个bx来寻址发现不行因为代码段的字符是1个字节的,然而到下一次循环(w下一个字符e的时候)地址要加2因为是ax(16位的)所以又加多了一个si,整体的思路比较简单 |