鱼C论坛

 找回密码
 立即注册
查看: 5839|回复: 6

关于监测点3.2的问题

[复制链接]
发表于 2012-3-3 08:50:22 | 显示全部楼层 |阅读模式
1鱼币
对于该题目,首先我题目就没有看懂!非常之郁闷。其次,对答案不能够理解,特别是特别是第二小问,中的几个空!因为我不明白当程序运行时是怎样的一种顺序,因为,pop或者push 后面的偏移地址到底是先执行数据段的还是执行栈段的,到底是怎么样的顺序执行操作的!求详细指教

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-3 18:31:30 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-3-3 18:56 编辑

首先你要先明白 什么是栈 栈空间  栈顶 栈低  push pop 进出的数据的方式 方向 以及  sp 的指向  执行push pop以后sp的指向
mov ax,2000H  
mov ds,ax     ;这就不说了设定数据段地址  将20000-2000f设置成数据段 数据存放是从0-f 这个顺序
mov ax,1000H   
mov ss,ax   
mov sp,0       这里设置 10000-1000f为栈段  栈顶应该是1000f 现在sp 指向0号内存单元位置  栈底的位置!~
pop [e]                这里执行pop 指令  执行的是将栈中数据 取出来放到 ds:[] 内存单元里 (附带说一句 push ax或者push[] 是将ax
pop [c]                或者内存单元中中数据放进去  pop ax或者pop []呢 是将栈中数据取出来放进 ax 或者[]内存单元
pop [a]                现在这一路pop 都是执行出栈  那么现在sp指向  0号内存单元 按照 出栈的说法 先将当前sp指向的数据放进[]内存单                           元 然后sp=sp+2   费点劲给你写个图         
pop [8]  
pop [6]  
pop [4]  
pop [2]  
pop [0]

按照颜色你也应该看明白了吧 如果真的 不明白就可以掉头看看 内存中数据的存放 栈 那些章节的内容别继续看后面了!~
借用王爽老师的一句话没用通过检测点的不要继续往下进行学习!~  

10000    sp  pop [e]              20000
10001    ↓                                20001
10002 sp+2 pop [c]                  20002
10003    ↓                                20003
10004  sp在加2  pop[a]            20004
10005   下面就不写了一样的         
10006
10007
.                                              2000a
.                                             2000b
.                                             2000c
.                                             2000d
.1000e                                   2000e   
.1000f                                    2000f




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

使用道具 举报

发表于 2012-3-5 14:40:59 | 显示全部楼层
第1题目意思是:用PUSH压栈的命令把10000H---10000FH里的内容移到20000H-2000FH里
第2题的意思是:用POP出栈的命令把10000H---10000FH里的内容移到20000H-2000FH里
1:
mov ax,1000H
mov ds,ax      (先用 mov ds,ax  把数据段寄存器DS置成段地址为1000H     )
.....
......
......
push [0]    (把DS指向1000:0的字入栈,但是没有设置栈段与初始化栈顶,计算机找不到位置存放,所以在空处应补上  mov ax ,2000       mov ss,ax         mov sp ,10       才可以把1000:0  里内容0123H 存放到2000E-2000F中             )
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-5 14:52:22 | 显示全部楼层
PUSH与POP后面的中括号[]都是数据段DS中的 偏移地址单元。PUSH与POP只是把DS指向内存数据存放到SS:SP所指向另一段内存空间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-13 08:41:38 | 显示全部楼层
有帮助,楼主加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

发表于 2021-2-7 12:20:50 | 显示全部楼层
首先你要明白栈是用户自己定义的,push就是把数据放到栈里,pop就是把数据从栈里取出来
1.先要把左边的数据设置为栈,段地址,也就是起始地址为ss:1000,偏移地址就是F + 1 = 10H,即栈顶为空间的最后一个字节地址+1 或者最后一个字地址 +2
mov ax,1000H
mov ss,ax
mov sp,10H
2.现在左边所有数据都在栈里了,只要pop到数据段就能实现要求
pop [E]   将栈底数据,也就是最上面一个数据出栈并赋值给ds:[E], 栈顶指针sp+2,移动到下面一个数据
pop [C]
...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 15:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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