鱼C论坛

 找回密码
 立即注册
查看: 2281|回复: 2

手动修改 sp 后程序出错。

[复制链接]
发表于 2012-2-27 21:40:17 | 显示全部楼层 |阅读模式
1鱼币
当 CS=SS 的时候,如果修改 SP的值的话下面程序运行会错误,即执行的不是原来的代码。

code segment
     mov sp,10
     mov ax,02h
     。。。
code ends

mov sp,10后面的都不是原来的语句。
但如果把SP设大一点的话就没事,程序执行原来的语句。

我用U 命令在执行 mov sp,10   的前后看了一下 CS的代码,发现前后不一样,执行前是原代码,执行后就是一些很奇怪码了。
这是为什么?


最佳答案

查看完整内容

什么为什么ss和cs一致?你代码放哪里?cs指向的是代码段,你用代码段放堆栈,肯定出错。从新定义 stack segemtn dw 0,0,0,0,0,0,0,0 stack ends 放前面 后面加 start: mov ax,stack mov ss,ax mov sp,16 就ok了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-27 21:40:18 | 显示全部楼层
什么为什么ss和cs一致?你代码放哪里?cs指向的是代码段,你用代码段放堆栈,肯定出错。从新定义
stack segemtn
dw 0,0,0,0,0,0,0,0
stack ends
放前面
后面加
start: mov ax,stack
mov ss,ax
mov sp,16
就ok了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-26 20:17:39 | 显示全部楼层
本帖最后由 wAterLoo 于 2012-3-26 20:22 编辑

push操作会将sp前面的一些字节向前推16个字节,好像是这么多,具体你可以实验实验,
由于cs和ss在同一个段,push后,sp设置的太少,cs正要执行的代码被覆盖,所以会出错

http://bbs.fishc.com/thread-15777-1-1.html 的原因是
因为debug的中断机制,需要现场保护,所以栈内至少要有六个字节来保存cs、ip和标志寄存器的数据  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-25 00:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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