鱼C论坛

 找回密码
 立即注册
查看: 2920|回复: 5

关于实验3的问题,为什么跟踪不完全。

[复制链接]
发表于 2011-6-23 00:20:30 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 xxasy 于 2011-6-23 09:24 编辑

assume cs:codesg
codesg segment
    mov ax,2000h
    mov ss,ax
    mov sp,0
    add sp,10
    pop ax
    pop bx
   push ax
   push bx
   pop ax
   pop bx

mov ax,4c00h
int 21h

codesg ends
end
一共两个问题。请懂的朋友指教一下。谢谢
1.为什么要让栈顶指针为2000:0下移到2000:0010?
2.第一次我写错了一行,add sp,10。被我写成add  sp,0后,用debug跟踪,为什么跟踪不全这些指令?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-23 06:41:59 | 显示全部楼层
本帖最后由 Miller01001 于 2011-6-23 06:58 编辑

1.为什么要让栈顶指针为2000:0下移到2000:0010?
2.第一次我写错了一行,add sp,10。被我写成add  sp,0后,用debug跟踪,为什么跟踪不全这些指令?
回答1:如果栈为空的话则SP偏移地址SP = SP - 2 PUSH的时候就是压栈,栈自动这样做一次,然后在把数据压栈,如果你不设置成栈顶的话,就溢出越界了给你写的软件带来很危险的事情。

回答2:溢出越界了,如果你要压1字节的数据,本身你栈为空!所以你的SP偏移  SP = SP - 2。已经越界到别的物理内存段去了
越界之后CS:IP指向的代码段也一定不一样了,所以你windows/DEBUG单步跟踪肯定不是一样的指令啦!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-23 08:18:01 | 显示全部楼层
是不是2000:0做栈顶指针,sp-2后前面的ss就不是20000段了。这样就溢出了?让指针下移到2000:0010。来保证在20000段以内?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-23 09:07:42 | 显示全部楼层
本帖最后由 Miller01001 于 2011-6-23 09:12 编辑

看你要存储多少的数据和数据类型而定,byte and word.字节和字
比如你要存储一个字节的数据,就不能让SP = SP - 2超出你设定的栈段的地址
CS:IP指向的内存的地址就不对了,指向了其他代码段

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-23 09:23:22 | 显示全部楼层
谢谢指教。:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-23 09:28:26 | 显示全部楼层
这样吧,SP = SP - 2有时候可能迷糊几天
你就这样记,栈的栈顶指针,永远指向你设置的栈段的最后的内存单元的下个一个地址
比如你设置了0 - F 这段是你的栈段,所以SP指向的栈顶,指向了F的下个地址10
这push压栈的时候 SP = SP - 2 , SP = E指向了栈顶。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-4-20 16:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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