. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于pop指令引发的一点思考  [已解决] 回复[ 9次 ]   点击[ 302次 ]  
regex
[帖 主]   [ 发表时间:2009-12-27 13:47 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
书里61页图3.12讲述了pop指令将1000CH单元的2266H出栈后, 2266H依然在1000CH处。
我可以不可以这么认为, 汇编语言没有cut指令(剪切),mov可以想象成复制指令吧?
通过debug实验也证实了这点。
mov ax,1234
mov bx,ax
所以说, 停留在1000CH里的内容将被新的push进来的信息覆盖。
scuzg
[第1楼]   [ 回复时间:2009-12-27 19:08 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
推论(汇编语言没有cut指令(剪切),mov可以想象成复制指令吧)正确。据传业界对汇编语言的数据传送指令使用 mov 为助记符认为是一种错误,因为它没有正确描述“数据传送”为复制的本质(二进制信息本质上是计算机开关器件的高低电平状态,数据“传送”其实就是将这些开关状态复制到另一组器件中);有些公司汇编语言的就用 cp 作为数据传送指令的助记符。
    再有就是,通过实验研究问题是个很好的习惯。
regex
[第2楼]   [ 回复时间:2009-12-27 23:26 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
感谢scuzg兄热心解惑。 以后有问题, 少不了麻烦您。 多谢啦。
parid
[第3楼]   [ 回复时间:2009-12-29 08:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-12-23 22:01
可我在debug里实验了下为什么就不行呢,我是这样弄的:
mov ax,1000
mov ss,ax
mov sp,8
mov bx,5
push bx   ;执行完这句后sp应该等于6
pop dx   ;执行完这句后sp应该等于8
mov sp,6 ;如果说出栈后数据仍在原来的位置,那么将sp指针的位置移到6的地方
pop ax  ;再次执行pop ,如果按照楼主所说,那么ax也应该等于5.可是得出的结果却不是5,请求高人解释一下
idisblueflash
[第4楼]   [ 回复时间:2009-12-29 09:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-12-28 20:29
如果你用debug里的t追的话,最好在t前加一个d 1000:0 7 查看内存状况。自会明了。
原因是pop,push后,貌似系统会因为保护现场将CS等数值放入其前,所以之后数据不会一样。
scuzg
[第5楼]   [ 回复时间:2009-12-29 09:47 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
parid 的实验很好,很有针对性,是学习汇编语言的好方法。
scuzg
[第6楼]   [ 回复时间:2009-12-29 10:19 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
按照 parid 的思路,全速执行下属代码:
-a
13AE:0100 mov ax,cs
13AE:0102 mov ss,ax
13AE:0104 mov sp,210
13AE:0107 mov ax,1
13AE:010A push ax
13AE:010B inc ax
13AE:010C push ax
13AE:010D inc ax
13AE:010E push ax
13AE:010F pop cx
13AE:0110 pop bx
13AE:0111 pop ax
13AE:0112 mov sp,20a
13AE:0115 pop di
13AE:0116 pop si
13AE:0117 pop dx
13AE:0118 int 3
13AE:0119
-g=100

AX=0001  BX=0002  CX=0003  DX=0001  SP=0210  BP=0000  SI=0002  DI=0003
DS=13AE  ES=13AE  SS=13AE  CS=13AE  IP=0118   NV UP EI PL NZ NA PE NC
13AE:0118 CC            INT     3
显然,由于全速运行没有了单步中断的“掺和”,堆栈只归应用程序单独使用,故弹出后堆栈的内容仍然没有变化(DX=0001  SI=0002  DI=0003)。
邯郸学步、东施效颦哈!
versaariel
[第7楼]   [ 回复时间:2009-12-29 12:53 ]   [引用]   [回复]   [ top ] 
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14
分析的不错哈,加油,细细品味,终有收获
regex
[第8楼]   [ 回复时间:2009-12-29 13:25 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
书里第三张实验2里说的,都是中断在作崇。
regex
[第9楼]   [ 回复时间:2010-01-01 15:34 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
此贴由 贴主 于 [ 2010-01-01 15:34 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved