.静待彼岸 发表于 2012-3-3 08:50:22

关于监测点3.2的问题

对于该题目,首先我题目就没有看懂!非常之郁闷。其次,对答案不能够理解,特别是特别是第二小问,中的几个空!因为我不明白当程序运行时是怎样的一种顺序,因为,pop或者push 后面的偏移地址到底是先执行数据段的还是执行栈段的,到底是怎么样的顺序执行操作的!求详细指教

莫名其妙 发表于 2012-3-3 18:31:30

本帖最后由 莫名其妙 于 2012-3-3 18:56 编辑

首先你要先明白 什么是栈 栈空间栈顶 栈低push pop 进出的数据的方式 方向 以及sp 的指向执行push pop以后sp的指向
mov ax,2000Hmov ds,ax   ;这就不说了设定数据段地址将20000-2000f设置成数据段 数据存放是从0-f 这个顺序mov ax,1000H   mov ss,ax    mov sp,0       这里设置 10000-1000f为栈段栈顶应该是1000f 现在sp 指向0号内存单元位置栈底的位置!~pop                 这里执行pop 指令执行的是将栈中数据 取出来放到 ds:[] 内存单元里 (附带说一句 push ax或者push[] 是将axpop                 或者内存单元中中数据放进去pop ax或者pop []呢 是将栈中数据取出来放进 ax 或者[]内存单元pop                 现在这一路pop 都是执行出栈那么现在sp指向0号内存单元 按照 出栈的说法 先将当前sp指向的数据放进[]内存单                           元 然后sp=sp+2   费点劲给你写个图          pop pop pop pop pop
按照颜色你也应该看明白了吧 如果真的 不明白就可以掉头看看 内存中数据的存放 栈 那些章节的内容别继续看后面了!~ 借用王爽老师的一句话没用通过检测点的不要继续往下进行学习!~
10000    sppop             2000010001    ↓                              2000110002 sp+2 pop                   2000210003    ↓                              2000310004sp在加2pop            2000410005 下面就不写了一样的          1000610007.                                              2000a.                                             2000b.                                             2000c.                                             2000d.1000e                                 2000e   .1000f                                    2000f



nfy123 发表于 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     (把DS指向1000:0的字入栈,但是没有设置栈段与初始化栈顶,计算机找不到位置存放,所以在空处应补上mov ax ,2000       mov ss,ax         mov sp ,10       才可以把1000:0里内容0123H 存放到2000E-2000F中             )

nfy123 发表于 2012-3-5 14:52:22

PUSH与POP后面的中括号[]都是数据段DS中的 偏移地址单元。PUSH与POP只是把DS指向内存数据存放到SS:SP所指向另一段内存空间。

冲啊大笼包 发表于 2016-11-13 08:41:38

有帮助,楼主加油

fishc1008 发表于 2016-12-31 12:16:40

学习学习

sos2356 发表于 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    将栈底数据,也就是最上面一个数据出栈并赋值给ds:, 栈顶指针sp+2,移动到下面一个数据
pop
...
页: [1]
查看完整版本: 关于监测点3.2的问题