萌辉 发表于 2013-9-8 23:24:09

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

如题,调试到一半的时候,和结束的时候

tsembrace 发表于 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...指令



萌辉 发表于 2013-9-8 23:26:03

难道是机器的事?

my_angel 发表于 2013-9-9 00:56:24

我看不太懂你想问什么,变化我只看到了一句mov ss,ax ,这肯定会改变ss的值啦,,

但是,我注意到一个问题,你改变了ss的值,那么堆栈也改变了,就不是以前的堆栈,。
因为我不知道你原ax的值是指向哪里,所以我不确定后面push时会不会改变原可执行代码部分。。。

欠你的幸福 发表于 2013-9-9 12:47:07

CS:IP的地址没搞好白——
      

萌辉 发表于 2013-9-9 20:33:38

my_angel 发表于 2013-9-9 00:56 static/image/common/back.gif
我看不太懂你想问什么,变化我只看到了一句mov ss,ax ,这肯定会改变ss的值啦,,

但是,我注意到一个问 ...

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:
               push ds:
               pop ds:
               pop ds:
               mov ax,4c00h
               int 21h
               code ends
               end

tsembrace 发表于 2013-9-9 20:57:06

没明白你的问题
mov ss,ax
这句之后ss里的值当然会变了

萌辉 发表于 2013-9-9 21:08:40

tsembrace 发表于 2013-9-9 20:57 static/image/common/back.gif
没明白你的问题
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个实验的程序和第一个相差不是太多可是调试到最后就不是这个情况了啊

萌辉 发表于 2013-9-9 23:05:27

tsembrace 发表于 2013-9-9 22:43 static/image/common/back.gif
在提问时要把问题描述清楚
根据你在1楼和7楼的描述,你的问题应该是:为何程序执行后,返回前,CS、SS、DS ...

原来是粗心大意惹得。这种错误编译连接的时候不报错

萌辉 发表于 2013-9-9 23:07:03

谢谢tsembrace 兄
页: [1]
查看完整版本: 实验5(2)调试到一半程序把ss的值改变了