一个很奇怪的问题。
;功能 显示用0结束的字符串 子程序名字. show_str;参数 (dh)=行号(0-24) (dl)=列号 (0-79)(cl)=颜色,ds:si指向字符串首地址
;返回 无
;b8000 bffff
;b800:0-b800:9f
;b800:a0-b800:13f
;行号:bx=dh*0a0h 显示位置:bx+dl | es:[bx][di]
assume cs:code ss:stack
stack segment
dw 128 dup(0)
stack ends
date segment
db'Welcom to masm!',0
date ends
code segment
start:mov dh,8
mov dl,3
mov cl,2
mov ax,date
mov ds,ax
mov si,0
mov ax,stack
mov ss,ax
mov sp,128
call show_str
mov ax,4c00h
int 21h
show_str: ;子程序开始
push ax
push di
push es
push bx
push cx
push si
push dx
;设置dh在B800里面的对应行
mov al,0a0h
mul dh
mov bx,ax
mov ax,0b800h
mov es,ax
;设置对应列
mov ah,0
mov dh,0
mov al,2
mul dl
;sub ax,2 ;这先看这一句,如果不使用这一句,程序正常。如果使用了这一句 下面的add dx,2 在DEBUG里面就变成了add dx,-32
mov di,ax
;设置颜色
mov ah,cl
;把字符移动显存里面
s:
mov cl,ds:[si]
mov ch,0
;遇到0就结束
jcxz ok
mov al,ds:[si]
mov es:[bx][di],ax ;把数据移入B800:x
inc si
add di,2 ;如果使用了sub ax,2 那么这句在内存里面就变成了 add di,-32
loop s
ok:
pop dx
pop si
pop cx
pop bx
pop es
pop di
pop ax
ret
code ends
end start