assume cs:codesg datasg segment db 'Welcome to masm!',0 datasg ends codesg segment start: mov ax,datasg mov ds,ax mov si,0 ;把ds:si指向datasg段 mov ax,0b800h mov es,ax mov di,0;设置es:di mov bx,0;bx是用来做显示的偏移地址 mov dh,8;行号 mov dl,3;列号 mov cl,02h;设置现实的字体颜色为绿色。 call show_str;调用显示的字符串 mov ax,4c00h int 21h show_str: ;我们在第九章的实验材料中知道显示的一行的偏移为0a0h mov al,0a0h dec dh;因为0a0h是第二行的开始,所以减去1后,即要在第八行显示,就要7*0a0h,不减的话就是在第九行显示了 mul dh;8行的偏移所以是7*0a0h mov bx,ax;把上面乘积的值给我们使用的偏移地址的寄存器bx mov al,2;由于每个字符占用两个字节即一个字 mul dl;空出6个字节即三个字。从第四个字开始填充要显示的字符 add bx,ax;这是计算出来的放第一个自发的起始地址 show:mov di,cx;因为下面要用到cx来判断字符是否为0,所以先把cx的值放到dx中保存起来。 mov cl,ds:[si];提取datasg段的第一个字符送到cl中 jcxz ok ;如果是0就表示已经取到字符串的末尾了 mov al,cl;把cl的值给al mov cx,di;现在把之前放在dx中的值还给cx mov ah,cl;这是把显示绿色的值给ah寄存器。 mov es:[bx],ax add bx,2;由于每个字符占用连个字节即一个字 inc si;取下一个字符 jmp short show;没取到末尾,就跳转到show处继续 ok: ret ;返回到主程序中 codesg ends end start