S-Jerry 发表于 2013-2-26 00:38:48

实验5(1)求助答案分析,真是想不出来了,停了很久了。

(1)将下面的程序编译连接,用Debug加载、跟踪,然后回答问题。

assume cs:code,ds:data,ss:stack

data segment

      dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

data ends

stack segment

      dw 0,0,0,0,0,0,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 start

①CPU执行程序,程序返回前,data段中的数据 不变 。

②CPU执行程序,程序返回前,CS= 0C88H ,SS= 0C87H ,DS= 0C86H 。

③设程序加载后,CODE段的段地址为X,则DATA段的段地址为 X-2 ,STACK段的段地址为 X-1 。




以下是答案:
C:\DOCUME~1\ADMINI~1>debug sy5-1.exe

-r

AX=0000BX=0000CX=0042DX=0000SP=0000BP=0000SI=0000DI=0000

DS=0C76ES=0C76SS=0C86CS=0C88IP=0000   NV UP EI PL NZ NA PO NC
                   这里为什么ss等于0c86ds等于0c76呢?
0C88:0000 B8870C      MOV   AX,0C87

-d 0c86:0 f

0C86:000023 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09   #.V.............

-u

0C88:0000 B8870C      MOV   AX,0C87这里为什么stack=0c87呢?
:dizzy:

鬼№精し灵 发表于 2013-2-26 12:55:39

视频教程里面不是有讲实验5么
没看懂社么意思
每台机器都不一样的

S-Jerry 发表于 2013-2-28 15:04:48

鬼№精し灵 发表于 2013-2-26 12:55 static/image/common/back.gif
视频教程里面不是有讲实验5么
没看懂社么意思
每台机器都不一样的

初始化确实参数可以不一样,但是在参数定下来后,为什么程序最开始当中的stack=0c87了呢?

L]V[G 发表于 2013-2-28 15:35:23

应该每台机器都不一样吧,ds,ss,cs段的值是cpu按照一定规律分配,可能每次都不一样!!但是这3个段又有一定的联系

这个题目的主要目的:让学习者能够进一步熟悉debug的操作

关键在第三问 ③设程序加载后,CODE段的段地址为X,则DATA段的段地址为 X-2 ,STACK段的段地址为 X-1 。这里是想让你知道每个段的最大长度是 64K,计算方法:64KB = 65536 B = 10000H B(前面两个是十进制的数,最后一个是16进制的)

于是,段地址加1,就是移动了64K( 例子:段地址为 0000:0000和段地址 0001:0000,相差了多少个字节?10000H个)
所以有了第三问的答案 , x-2 和 x- 1

建议楼主继续学习下去,不通过知识点也可以向下学习,有时候,突然间,你就明白了原来不懂了,采取一种迂回向上的方法学习!!另外在敲程序的时候,错的越多越好!!千万别灰心,最重要的是耐心弄懂哪里出错了,以后遇到同样的问题的时候,你就不会出错了,还懂得改正别人程序的错误

我本无罪 发表于 2013-2-28 22:46:26

关于那个ss与ds的关系个人感觉可以从书上92也得到答案擦得1个字节是PSP的存储的

S-Jerry 发表于 2013-3-9 15:40:08

L]V static/image/common/back.gif
应该每台机器都不一样吧,ds,ss,cs段的值是cpu按照一定规律分配,可能每次都不一样!!但是这3个段又有一 ...

感谢你的回答。
另外在你的回答里面我有个问题:
你举了个列子说段地址0001:0000 与段地址0000:0000相差10000H个字节。
不过按书上说的,0001:0000等于00010,   0000:0000等于00000. 那么在段地址上面的差距可以用偏移地址上面的数来表示,那么也就可以写成段地址0000:0010与0000:0000的差别。显然只是偏移地址相差了10H,那就只相差了10h个字节了?

L]V[G 发表于 2013-3-9 17:39:27

S-Jerry 发表于 2013-3-9 15:40 static/image/common/back.gif
感谢你的回答。
另外在你的回答里面我有个问题:
你举了个列子说段地址0001:0000 与段地址0000:0000相差 ...

谢谢你的提醒。我的回答的确错了, 0000:0000和 0001:0000是相差了10h个字节。
回到题目那里,那个程序,刚开始的时候定义了 8个 字型数据,为数据段,占16个字节;
然后又定义了8个字型数据,为栈段,占16个字节
最后就到了代码段。
于是,数据段和栈段之间的差距,就是16个字节,即10h个。
同理,栈段和代码段的差距也是 16个字节。于是就有了第三问的答案了。
谢谢楼主的提醒,我也是刚学的,所以犯了这种错误。

S-Jerry 发表于 2013-3-9 18:34:24

L]V static/image/common/back.gif
谢谢你的提醒。我的回答的确错了, 0000:0000和 0001:0000是相差了10h个字节。
回到题目那里,那个程序 ...

呵呵,不谢,我也是看了你说的段的关系才有点懂的。
大家一起学习嘛
页: [1]
查看完整版本: 实验5(1)求助答案分析,真是想不出来了,停了很久了。