王爽汇编 实验10

2025-01-21 03:02:47
推荐回答(3个)
回答1:

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: 后面就可以了

回答2:

这就对了,不崩溃才奇怪呢!
分析代码就知道是错误使用堆栈的例子
典型的堆栈失衡
push dx
push cx
push ds
push si
call show_str
;......
show_str:
;......
pop si
pop ds
pop cx
pop dx
ret

很明显不对称;

回答3:

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
你的代码应该有错,具体我没试过