鱼C论坛

 找回密码
 立即注册
查看: 1968|回复: 6

试验10的第一题!代码中没有设置栈段,用call转移后用ret还能跳回来!

[复制链接]
发表于 2012-7-28 20:00:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 天长地久 于 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:[si]
     mov cl,ds:[si]
     jcxz s0
     mov cl,3
     mov es:[bx+di],ax
     inc si
     add bx,2
     loop s
s0:    ret
     
code ends
end start

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-29 00:08:35 | 显示全部楼层
请高手指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-29 10:27:34 | 显示全部楼层
系统在程序运行时会给你一个栈的位置,但那可能不不安全,你debug运行时,用r命令,能看到ss:sp指向了一个位置,但那个位置存放了什么就不得而知了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-29 10:28:17 | 显示全部楼层
话说,你入门就学第十章了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-29 10:53:34 | 显示全部楼层
刚才Debug了一下。发现不定义栈段时。SS初始默认值都是整个程序的初始地址。就是在PSP 256字节后的地址,这时SP=0。。如果执行Push。0-2=10000-2=FFFE。。这时栈顶指向了SS:FFFE。。
我测试时用D查看了一下。栈顶附近基本全是无数据。。也就是相对安全的地方。

你所说的不定义栈段用Call和Ret能正常使用就是这样的原因。SS默认是有数据的。整个程序的初始地址,非代码段入口。不过我习惯还是定义一下比较好。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-29 18:03:49 | 显示全部楼层
卡不明白。。。。。。。。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-7-29 23:23:40 | 显示全部楼层

原来是这样,谢谢斑竹解答~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-16 23:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表