assume cs:code
data segment
db 'Welcome to masm!',0
data ends
stack segment
dw 8 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16 ;设置栈段
mov dh,8 ;输入行号
mov dl,3 ;输入列号
mov cl,2 ;输入颜色
mov ax,data
mov ds,ax
mov si,0 ;设置字符串首地址
call show_str ;调用子程序show_str
mov ax,4c00h
int 21h
show_str: push es
push ds
push si
push ax
push bx
push dx
push cx ;将子程序用到的寄存器入栈
mov al,10
mul dh
mov bx,0b800h
add ax,bx
mov es,ax ;设置行段地址
mov bh,0
mov bl,dl
add bx,bx
sub bx,2 ;设置第一个字符的偏移地址(列地址)
s: mov cl,[si]
mov ch,0
jcxz ok ;如果(cx)=0,结束;如果不是0,处理
pop cx ;将子程序中要用的寄存器内的内容出栈
push cx ;将子程序要用到的寄存器入栈
mov dl,[si]
mov es:[bx],dl ;将字符的ASCII码写入显存
mov es:[bx+1],cl ;将字符的属性写入显存
inc si
add bx,2 ;下一个字符
jmp near ptr s ;跳转到s处执行
ok: pop cx
pop dx
pop bx
pop ax
pop si
pop ds
pop es ;将子程序用到的寄存器出栈
ret
code ends
end start
此程序能顺利实现功能,但debug中用t单步执行时,运行到push dx时会引起冲突关闭程序,需用g命令直接运行到mov ax,4c00h,才能顺利显示字符,为什么呢? |