|
主题 : : 关于pop指令引发的一点思考 [已解决] |
回复[ 9次 ]
点击[ 302次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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进来的信息覆盖。 | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-12-27 19:08 ]
[引用]
[回复]
[ top ] | |
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46 |
推论(汇编语言没有cut指令(剪切),mov可以想象成复制指令吧)正确。据传业界对汇编语言的数据传送指令使用 mov 为助记符认为是一种错误,因为它没有正确描述“数据传送”为复制的本质(二进制信息本质上是计算机开关器件的高低电平状态,数据“传送”其实就是将这些开关状态复制到另一组器件中);有些公司汇编语言的就用 cp 作为数据传送指令的助记符。
再有就是,通过实验研究问题是个很好的习惯。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2009-12-27 23:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51 |
感谢scuzg兄热心解惑。 以后有问题, 少不了麻烦您。 多谢啦。 | | |
|
|
|
|
[第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,请求高人解释一下 | | |
|
|
|
|
[第4楼]
[ 回复时间:2009-12-29 09:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-12-28 20:29 |
如果你用debug里的t追的话,最好在t前加一个d 1000:0 7 查看内存状况。自会明了。
原因是pop,push后,貌似系统会因为保护现场将CS等数值放入其前,所以之后数据不会一样。 | | |
|
|
|
|
[第5楼]
[ 回复时间:2009-12-29 09:47 ]
[引用]
[回复]
[ top ] | |
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46 |
parid 的实验很好,很有针对性,是学习汇编语言的好方法。 | | |
|
|
|
|
[第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)。
邯郸学步、东施效颦哈! | | |
|
|
|
|
[第7楼]
[ 回复时间:2009-12-29 12:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14 |
|
|
|
|
|
[第8楼]
[ 回复时间:2009-12-29 13:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51 |
|
|
|
|
|
[第9楼]
[ 回复时间:2010-01-01 15:34 ]
[引用]
[回复]
[ top ] | |
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51 |
此贴由 贴主 于 [ 2010-01-01 15:34 ] 结贴。 结贴原因:问题已解决 | | |