原文如下:
编程,将10000H~1000FH这段空间当做栈,初始状态栈是空的,将AX,BX,DS中的数据入栈。
思考后看分析。
分析:
代码如下:
mov ax,1000H
mov ss,ax ;设置栈的段地址,ss=1000H,不能直接向段寄存器ss送入数据,所以用ax中转。
mov sp,0010H ;设置栈顶的偏移地址,因栈为空,所以sp=0010H,.....
我的理解是这样的,如下:
0FFF:000E
0FFF:000F
----------------
1000:0000
1000:0001
...
...
1000:000E
1000:000F
-----------------
1000:0010
1000:0011
...
...
1000:FFFE
1000:FFFF
-----------------
1001:0000
为了使栈的底部第一个字单元的地址是1000:000E,所以设置sp的值为1000:0010,
这样在第一个元素入栈时sp自加2正好第一个元素的偏移地址。
在给ss赋值同时sp得到一个初始偏移值FFFE,为什么自动分配给sp的值是FFFE?
如果要让第一个入栈的偏移值为FFFE,对FFFE+2=10000,溢出,sp=0000了,
但是如果是0000的话就成1000段的第一个地址了,所以CPU分配了FFFE给sp。
用C#来理解,栈有点像ArrayList类,它的元素不能够随意访问,必须按照后进先出
的规则来逐个增加和读取,且读取后该元素即被移除,指针始终指向最后加入此数组
中的元素。
我想应该大概是这个样子,请大家帮忙指正 |