试验10的第一题!代码中没有设置栈段,用call转移后用ret还能跳回来!
本帖最后由 天长地久 于 2012-7-28 20:06 编辑我真是想不通call后IP的数据是保存在哪个位置的? ret又怎么能跳回来!
call 执行不是要先push ip然后在 jmp吗? 没栈段怎么保存IP?
ret执行不是要先pop ip 然后在 jmp吗?上面都没保存怎么知道IP是多少?
代码编译后可以正确执行!
我是入门级的,请高手指点指点!代码如下!
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
mov ax,4c00h
int 21h
show:mov ax,0b800h
mov es,ax
mov al,dh
mov ah,0
mov bl,160
mul bl
mov bx,0
mov bl,dl
add bl,dl
mov di,ax
s: mov ah,cl
mov al,ds:
mov cl,ds:
jcxz s0
mov cl,3
mov es:,ax
inc si
add bx,2
loop s
s0: ret
code ends
end start
请高手指点 系统在程序运行时会给你一个栈的位置,但那可能不不安全,你debug运行时,用r命令,能看到ss:sp指向了一个位置,但那个位置存放了什么就不得而知了 话说,你入门就学第十章了? 刚才Debug了一下。发现不定义栈段时。SS初始默认值都是整个程序的初始地址。就是在PSP 256字节后的地址,这时SP=0。。如果执行Push。0-2=10000-2=FFFE。。这时栈顶指向了SS:FFFE。。
我测试时用D查看了一下。栈顶附近基本全是无数据。。也就是相对安全的地方。
你所说的不定义栈段用Call和Ret能正常使用就是这样的原因。SS默认是有数据的。整个程序的初始地址,非代码段入口。{:5_109:}不过我习惯还是定义一下比较好。。 卡不明白。。。。。。。。。。。。。。 Potato丶 发表于 2012-7-29 10:53 static/image/common/back.gif
刚才Debug了一下。发现不定义栈段时。SS初始默认值都是整个程序的初始地址。就是在PSP 256字节后的地址,这 ...
原来是这样,谢谢斑竹解答~~
页:
[1]