|
主题 : : 检测点3.2(2).求助 [待解决] |
回复[ 9次 ]
点击[ 866次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-05-09 21:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-05-04 16:21 |
检测点3.2(2).补全下面的程序,使其可以将10000H至1000FH中的8个字,逆序拷贝到20000H至2000FH中.
mov ax,2000H
mov ds,ax
__1__
__2__
__3__
pop [E]
pop [C]
pop [A]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]
答案是:
1.mov ax,1000H
2.mov ss,ax
3.mov sp,0H 为什么是给sp赋0 我做的时候是给sp赋10h | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-05-09 22:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23 |
你按照栈的操作原理自己理一边程序就明白了。
pop指令会将sp加2,如果按你的地址,你看看,你拷贝的是什么数据啊?? | | |
|
|
|
|
[第2楼]
[ 回复时间:2008-05-10 09:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-05-04 16:21 |
明白了 谢谢楼上
但是我在汇编后调试总出错 不知道是怎么回事
出错地方全是在出栈存入内存那里
symbol not defined:E
symbol not defined:C
symbol not defined:A
immediata mode illegal
immediata mode illegal
immediata mode illegal
请高人指点 | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-05-19 06:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2008-05-08 23:42 |
你好 我也是在这里卡了好半天 现在终于想明白了 看我说的对不对。3.2(2)的答案1是错的 应当是mov ax 2000h后面两个是对的。ds=1000h开始的是数据段, pop[e]的意思详见p60 页 的倒数第6行 我理解的是将ds=1000h开始的数据段的000eh的字单元地址作为接受出栈数据的内存地址,栈段还是在2000h处(注意不是在1000h处,如果按照原答案ss=1000h,这题没法解释,所以答案ax要改为2000h),这时候的栈空间是满的,sp=0,确实已指向真正的栈顶,根据后进先出的规定,2000h栈段的最后数据在sp=0处 那么pop【e】的意思就是将sp=0的数据出栈 而送到数据段1000h:000eh处 理解这道题哦关键是ds=1000h处是数据段,没有变成栈段。而ss=2000h处在这道题里始终是栈段。
以上是我的理解, 不知对不对。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2008-05-19 09:52 ]
[引用]
[回复]
[ top ] | |
荣誉值:56
信誉值:0
注册日期:2008-01-19 14:51 |
pop [E] 在debug下使用是没有问题的(E就是16进制数E),而缺省条件下ds被用来做段寄存器。
如果使用masm5.0编译,那么指令
pop [E]就要写成pop 段寄存器:[0Eh]的形式,为什么?编译器把E当作标号。
关于16进制数 A B C D E 的使用,如果有不清楚,建议楼主看看书。
注意,debug 和 masm 对汇编指令的支持是有区别的,先给提个醒,以后学习你会慢慢遇到,慢慢清楚的。 | | |
|
|
|
|
[第5楼]
[ 回复时间:2008-05-19 13:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2008-05-08 23:42 |
|
|
|
|
|
[第6楼]
[ 回复时间:2008-06-09 13:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-05-26 22:48 |
答案没错啊...
mov ax,2000H
mov ds,ax 这是设置DS为2000H
--------------------------------
mov ax,1000H
mov ss,ax
mov sp,0H 这是将10000H-1000F这段空间为栈,栈顶为10000H
-----------------------------------------------------
pop [E]
pop [C]
pop [A]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]
因为前面ds为2000H,所以pop [e]意思就是:把10000H-1000FH出栈的数据送入2000EH处.
这样就实现"将10000H至1000FH中的8个字,逆序拷贝到20000H至2000FH中"
----------------------------------------------------------
下面是书上解释:
push [内存单元];将一个内存字单元处的字入栈(注意:栈操作都是以字为单位)
pop [内存单元];出栈,用一个内存单元接收出栈的数据.
---------------
这是我的理解.... | | |
|
|
|
|
[第7楼]
[ 回复时间:2008-06-09 18:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2008-05-08 23:42 |
讲十遍 不如试一遍 你上机调试一下 ,通过了 ,证明你对,通不过证明你错 | | |
|
|
|
|
[第8楼]
[ 回复时间:2010-06-01 14:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-11-06 13:04 |
前提条件是10000H~1000FH栈满,用pop 内存单元 指令时,栈内第一个字单元出栈,那么你的栈顶指向怎么会在0010H呢? | | |
|
|
|
|
[第9楼]
[ 回复时间:2010-07-13 10:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-06-01 10:03 |
前提条件是10000H~1000FH栈满,用pop 内存单元 指令时,栈内第一个字单元出栈,那么你的栈顶指向怎么会在0010H呢?
------------------
回复:我觉得很多人会习惯性的把创建空栈时的sp与现在栈满出栈时的sp值搞错。对于10000H至1000FH的栈,栈满sp为0,栈空时sp为0010H。 | | |