call show_str 指令相当于进行:
push ip
jmp near ptr show_str
指令里有个 ip入栈,所以你的程序执完后 栈底到栈顶的元素依次是 dx,cx,ds,si,ip.
后面 pop si 指令是把 栈顶元素给si, 但此时栈顶 放的是 ip的值,所以出错了,相应的ds,cx.dx的值都错了, 后面 RET指令相当于:pop ip ,所以返回的ip也错了,程序无法正常返回
你把 push dx
push cx
push ds
push si
这四条指令放到show_str: 后面就可以了
这就对了,不崩溃才奇怪呢!
分析代码就知道是错误使用堆栈的例子
典型的堆栈失衡
push dx
push cx
push ds
push si
call show_str
;......
show_str:
;......
pop si
pop ds
pop cx
pop dx
ret
很明显不对称;
assume cs:code
data segment
db 'welcome to masm!',0
data ends
code segment
start: mov dh,8
mov dl,3
mov cl,2
mov ax,data
mov ds,ax
mov si,0
call show_str
mov ax,4c00h
int 21h
show_str:mov ax,0b800h
mov es,ax
push cx
mov al,0a0h
mul dh
mov bx,ax
mov al,2
mul dl
add bx,ax
pop dx
s:mov cl,[si]
mov ch,0
jcxz ok
mov ch,dl
mov es:[bx],cx
add bx,2
inc si
jmp short s
ok:ret
mov ax,4c00h
int 21h
code ends
end start
你的代码应该有错,具体我没试过