. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  检测点3.2(2).求助  [待解决] 回复[ 9次 ]   点击[ 866次 ]  
zhengbo
[帖 主]   [ 发表时间: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
younggay
[第1楼]   [ 回复时间:2008-05-09 22:46 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
你按照栈的操作原理自己理一边程序就明白了。
pop指令会将sp加2,如果按你的地址,你看看,你拷贝的是什么数据啊??
zhengbo
[第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
 请高人指点
lmyycx
[第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处在这道题里始终是栈段。

以上是我的理解, 不知对不对。
deepblue
[第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 对汇编指令的支持是有区别的,先给提个醒,以后学习你会慢慢遇到,慢慢清楚的。
lmyycx
[第5楼]   [ 回复时间:2008-05-19 13:50 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2008-05-08 23:42
deepblue的提醒很重要 这里谢了
fcrong
[第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 [内存单元];出栈,用一个内存单元接收出栈的数据.
---------------
这是我的理解....
lmyycx
[第7楼]   [ 回复时间:2008-06-09 18:06 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2008-05-08 23:42
讲十遍 不如试一遍 你上机调试一下 ,通过了 ,证明你对,通不过证明你错
kinwook
[第8楼]   [ 回复时间:2010-06-01 14:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-11-06 13:04
前提条件是10000H~1000FH栈满,用pop 内存单元 指令时,栈内第一个字单元出栈,那么你的栈顶指向怎么会在0010H呢?
lin1712
[第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。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved