鱼C论坛

 找回密码
 立即注册
查看: 2141|回复: 7

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

[复制链接]
发表于 2013-2-26 00:38:48 | 显示全部楼层 |阅读模式

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

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

x
(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:[0]

        push ds:[2]

        pop ds:[2]

        pop ds:[0]

        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=0000  BX=0000  CX=0042  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000

DS=0C76  ES=0C76  SS=0C86  CS=0C88  IP=0000   NV UP EI PL NZ NA PO NC
                   这里为什么ss等于0c86  ds等于0c76呢?
0C88:0000 B8870C        MOV     AX,0C87

-d 0c86:0 f

0C86:0000  23 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:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-26 12:55:39 | 显示全部楼层
视频教程里面不是有讲实验5么
没看懂社么意思
每台机器都不一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-2-28 15:04:48 | 显示全部楼层

初始化确实参数可以不一样,但是在参数定下来后,为什么程序最开始当中的stack=0c87了呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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

建议楼主继续学习下去,不通过知识点也可以向下学习,有时候,突然间,你就明白了原来不懂了,采取一种迂回向上的方法学习!!另外在敲程序的时候,错的越多越好!!千万别灰心,最重要的是耐心弄懂哪里出错了,以后遇到同样的问题的时候,你就不会出错了,还懂得改正别人程序的错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-28 22:46:26 | 显示全部楼层
关于那个ss与ds的关系个人感觉可以从书上92也得到答案擦得1个字节是PSP的存储的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-3-9 15:40:08 | 显示全部楼层
L]V[G 发表于 2013-2-28 15:35
应该每台机器都不一样吧,ds,ss,cs段的值是cpu按照一定规律分配,可能每次都不一样!!但是这3个段又有一 ...

感谢你的回答。
另外在你的回答里面我有个问题:
你举了个列子说段地址0001:0000 与段地址0000:0000相差10000H个字节。
不过按书上说的,0001:0000等于00010,   0000:0000等于00000. 那么在段地址上面的差距可以用偏移地址上面的数来表示,那么也就可以写成段地址0000:0010与0000:0000的差别。显然只是偏移地址相差了10H,那就只相差了10h个字节了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-9 17:39:27 | 显示全部楼层
S-Jerry 发表于 2013-3-9 15:40
感谢你的回答。
另外在你的回答里面我有个问题:
你举了个列子说段地址0001:0000 与段地址0000:0000相差 ...

谢谢你的提醒。我的回答的确错了, 0000:0000和 0001:0000是相差了10h个字节。
回到题目那里,那个程序,刚开始的时候定义了 8个 字型数据,为数据段,占16个字节;
然后又定义了8个字型数据,为栈段,占16个字节
最后就到了代码段。
于是,数据段和栈段之间的差距,就是16个字节,即10h个。
同理,栈段和代码段的差距也是 16个字节。于是就有了第三问的答案了。
谢谢楼主的提醒,我也是刚学的,所以犯了这种错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-3-9 18:34:24 | 显示全部楼层
L]V[G 发表于 2013-3-9 17:39
谢谢你的提醒。我的回答的确错了, 0000:0000和 0001:0000是相差了10h个字节。
回到题目那里,那个程序 ...

呵呵,不谢,我也是看了你说的段的关系才有点懂的。
大家一起学习嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-10-7 22:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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