天长地久 发表于 2012-7-28 20:00:45

试验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

网络学习 发表于 2012-7-29 00:08:35

请高手指点

张国祥 发表于 2012-7-29 10:27:34

系统在程序运行时会给你一个栈的位置,但那可能不不安全,你debug运行时,用r命令,能看到ss:sp指向了一个位置,但那个位置存放了什么就不得而知了

张国祥 发表于 2012-7-29 10:28:17

话说,你入门就学第十章了?

Potato丶 发表于 2012-7-29 10:53:34

刚才Debug了一下。发现不定义栈段时。SS初始默认值都是整个程序的初始地址。就是在PSP 256字节后的地址,这时SP=0。。如果执行Push。0-2=10000-2=FFFE。。这时栈顶指向了SS:FFFE。。
我测试时用D查看了一下。栈顶附近基本全是无数据。。也就是相对安全的地方。

你所说的不定义栈段用Call和Ret能正常使用就是这样的原因。SS默认是有数据的。整个程序的初始地址,非代码段入口。{:5_109:}不过我习惯还是定义一下比较好。。

zhonganyun 发表于 2012-7-29 18:03:49

卡不明白。。。。。。。。。。。。。。

天长地久 发表于 2012-7-29 23:23:40

Potato丶 发表于 2012-7-29 10:53 static/image/common/back.gif
刚才Debug了一下。发现不定义栈段时。SS初始默认值都是整个程序的初始地址。就是在PSP 256字节后的地址,这 ...

原来是这样,谢谢斑竹解答~~
页: [1]
查看完整版本: 试验10的第一题!代码中没有设置栈段,用call转移后用ret还能跳回来!