鱼C论坛

 找回密码
 立即注册
查看: 1950|回复: 9

实验5(2)调试到一半程序把ss的值改变了

[复制链接]
发表于 2013-9-8 23:24:09 | 显示全部楼层 |阅读模式
5鱼币
1.png 如题,调试到一半的时候,和结束的时候
2.png

最佳答案

查看完整内容

在提问时要把问题描述清楚 根据你在1楼和7楼的描述,你的问题应该是:为何程序执行后,返回前,CS、SS、DS中的值为何不是按设想的X,X-1,X-2的关系。(直接就是代码段中预设的各段的关系) 问题在于最后一句end 应该是:end start 这个细心些不难发现 ----------------------------------------------------------- 不加start的话,程序就从第一句作为指令开始执行,即把你data段中定义的0123h,...和stack段中的000..都作为指 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-8 23:24:10 | 显示全部楼层
在提问时要把问题描述清楚
根据你在1楼和7楼的描述,你的问题应该是:为何程序执行后,返回前,CS、SS、DS中的值为何不是按设想的X,X-1,X-2的关系。(直接就是代码段中预设的各段的关系)
问题在于最后一句end
应该是:end start
这个细心些不难发现
-----------------------------------------------------------
不加start的话,程序就从第一句作为指令开始执行,即把你data段中定义的0123h,...和stack段中的000..都作为指令执行了;
至于你第一张图里为何mov ss,ax之前的指令不是mov ax,stack而成了add ..指令,是因为stack段中最后2个0和mov ax,stack(B8XXXX)构成了新的机器码00B8XXXXX,这个机器码对应的就是add...指令



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-9-8 23:26:03 | 显示全部楼层
难道是机器的事?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-9 00:56:24 | 显示全部楼层
我看不太懂你想问什么,变化我只看到了一句mov ss,ax ,这肯定会改变ss的值啦,,

但是,我注意到一个问题,你改变了ss的值,那么堆栈也改变了,就不是以前的堆栈,。
因为我不知道你原ax的值是指向哪里,所以我不确定后面push时会不会改变原可执行代码部分。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-9 12:47:07 | 显示全部楼层
CS:IP的地址没搞好白——
      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-9-9 20:33:38 | 显示全部楼层

mov ss,ax我只是在设定栈段,程序是按照书上来的
assume cs:code,ds:data,ss:stack
data segment
  dw 0123h,0456h
  data ends
  stack segment
  dw 0,0
  stack ends
  code segment
  start: mov ax,stack
         mov ss,ax
                 mov sp,16
                 mov ax,data
                 mov ds,ax
                 push ds:[0]
                 push ds:[2]
                 pop ds:[2]
                 pop ds:[0]
                 mov ax,4c00h
                 int 21h
                 code ends
                 end
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-9 20:57:06 | 显示全部楼层
没明白你的问题
mov ss,ax
这句之后ss里的值当然会变了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-9-9 21:08:40 | 显示全部楼层
tsembrace 发表于 2013-9-9 20:57
没明白你的问题
mov ss,ax
这句之后ss里的值当然会变了

我的意思是程序调试到最后一步这几个寄存器的值不会相差太多的,这个是答案,②CPU执行程序,程序返回前,CS= 0C88H ,SS= 0C87H ,DS= 0C86H 。

③设程序加载后,CODE段的段地址为X,则DATA段的段地址为 X-2 ,STACK段的段地址为 X-1 。
我第一个实验做到最后设程序加载后,CODE段的段地址为X,则DATA段的段地址为 X-2 ,STACK段的段地址为 X-1是这个情况,第2个实验的程序和第一个相差不是太多可是调试到最后就不是这个情况了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-9-9 23:05:27 | 显示全部楼层
tsembrace 发表于 2013-9-9 22:43
在提问时要把问题描述清楚
根据你在1楼和7楼的描述,你的问题应该是:为何程序执行后,返回前,CS、SS、DS ...

原来是粗心大意惹得。这种错误编译连接的时候不报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-9-9 23:07:03 | 显示全部楼层
谢谢tsembrace 兄
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 07:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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