鱼C论坛

 找回密码
 立即注册
查看: 2337|回复: 11

王爽老师的书 134页实验5 第一个

[复制链接]
发表于 2013-8-17 22:02:38 | 显示全部楼层 |阅读模式
3鱼币
360软件小助手截图20130817215809.jpg 360软件小助手截图20130817215921.jpg


第一问中 我认为在栈中有16个字节 记作0~15 0~7应该全是0 后面才是0123h,0456h
所以data的数据应该前两个为0,后面不变
但是答案却说data没有变化

请问为什么呢

第三问 答案给的是x-2,x-1
请问为什么

最佳答案

查看完整内容

栈让你理解先入后出的概念 第三问中主要是让你理解DW的定义,随后加深段地址和偏移地址的概念 x-2,x-1数据段是在代码段的前面怎么能理解成偏移地址数值比较大呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-17 22:02:39 | 显示全部楼层

栈让你理解先入后出的概念
第三问中主要是让你理解DW的定义,随后加深段地址和偏移地址的概念
x-2,x-1数据段是在代码段的前面怎么能理解成偏移地址数值比较大呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-18 07:19:53 | 显示全部楼层
本帖最后由 小咒 于 2013-8-18 07:25 编辑

dw定义字形数据占2个字节
data段8个字,16个字节
stack段8个字,16个字节
内存形象如下:
QQ截图20130818071700_副本.jpg
我们查看段地址为1000偏移地址为0的内存地址
内存地址每一行为16个字节
我们将段地址+1后继续查看得到结果如上图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-18 09:04:11 | 显示全部楼层
小咒 发表于 2013-8-18 07:19
dw定义字形数据占2个字节
data段8个字,16个字节
stack段8个字,16个字节

那么第一问中 初始状态为栈中是8个0
将数据push进去后 再pop出来的还是0啊
就象这样
0

0

0

。。。


0123h

0456h






第三问中我如果认为段地址也是X 但是偏移地址数值比较大 这样理解可不可以呢

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

使用道具 举报

发表于 2013-8-18 14:31:26 | 显示全部楼层
第一问,都不需要管其他,涉及到原始数据段的就以下四句:
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
push的两句不影响原始data段数据;
pop的两句用栈内数据复制到data段;但栈是先入后出,所以第一次pop的数据是最好一次push的数据,每次pop到ds:[x]的值刚好是之前push ds:[x]的数值,所以data段数值仍然没变化的。
第二问:
该程序加载后,设ds寄存器的值为Y,系统为整个程序分配内存分布如下:
Y:0~Y:0ffh  PSP区--->对应起始偏移地址为0的段地址为Y
Y:100h~Y:10fh  data数据段区域--->对应起始偏移地址为0的段地址为(Y+10h)
Y:110h~Y:11fh  stack栈段区域--->对应起始偏移地址为0的段地址为(Y+11h)
Y:120h~Y:(120h+(cx-1))  代码段区域,加载后cx为代码段长度---->对应起始偏移地址为0的段地址为(Y+12h),即cs的值。
即若cs为X,则data和stack对应的段地址为X-2和X-1.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-18 14:39:12 | 显示全部楼层
sentiment 发表于 2013-8-18 09:04
那么第一问中 初始状态为栈中是8个0
将数据push进去后 再pop出来的还是0啊
就象这样

直接回答你的“第三问中我如果认为段地址也是X 但是偏移地址数值比较大 这样理解可不可以呢”
不可以。
但反向问的话,你的理解我个人认为也是对的。
即:如果设data段为X,那么stack和code的段地址为多少?
这里有两个需要说明的地方:
首先对于一个内存段,段地址:偏移地址的表示不是唯一的。所以针对上述问题,stack和code的段地址也可以认为是X,只不过,当段地址为X时候,其对应的偏移地址不再是0了。
其次,data,stack,code作为段地址标识符,他们所表示的段地址是针对偏移地址为0的情况。这才会有诸如:
mov ax,data
mov ds,ax
mov bx,0
之类的指令。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-18 15:19:14 | 显示全部楼层
tsembrace 发表于 2013-8-18 14:31
第一问,都不需要管其他,涉及到原始数据段的就以下四句:
push ds:[0]
push ds:[2]

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

使用道具 举报

发表于 2013-8-23 13:23:08 | 显示全部楼层
这个问题我也看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-24 18:23:22 | 显示全部楼层
其实我表示只是第二问不懂!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-29 16:57:26 | 显示全部楼层
为什么图中的sp的指向16呢 ,一直想不明白 ?谁能帮忙说下 ,谢谢了
QQ图片20130829165552.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-2 12:52:22 | 显示全部楼层
006 发表于 2013-8-29 16:57
为什么图中的sp的指向16呢 ,一直想不明白 ?谁能帮忙说下 ,谢谢了

这个是以栈段为段地址的。不要和数据段混了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-31 10:18:29 | 显示全部楼层
学习学习再学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 13:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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