栈是一种具有特殊的访问方式的存储空间,它的特殊在于后进先出
SS:SP指向的存储单元为栈空间(栈的操作都为字操作)SS:SP始终指向栈顶
当栈为空是SP指针指向栈顶元素为栈中最后一个字单元地址+2
也可以说当栈为空时SP指向栈中最后一个存储单元的下一个单元
stack segment
dw 8 dup(0);我们定义一个段使SS:SP指向这个段此时为栈段
stack ends
定义了16个字节的栈空间,内存单元为0~15,最后一个字单元为14栈顶指向14+2=10H
最后一个字节单元为15下一个单元为16=10H
所以假设一个16字节的栈为空那么SP=10H
;***********************************************************************************
stack segment
db 16 dup(?) ;申请一个栈空间,大小为16字节单元
stack ends
code segment
mov ax,stack
mov ss,ax ;设栈段为1000H 表1
mov ax,1234H
mov sp,10H ;SP指向栈顶
push ax ;执行入栈指令,执行完之后SP指向新的栈顶 表2
code ends
内存 | 地址 | 备注 |
NULL | 10000H | |
NULL | 10001H | |
NULL | 10002H | |
NULL | 10003H | |
NULL | 10004H | |
NULL | 10005H | |
NULL | 10006H | |
NULL | 10007H | |
NULL | 10008H | |
NULL | 10009H | |
NULL | 1000AH | |
NULL | 1000BH | |
NULL | 1000CH | |
NULL | 1000DH | |
NULL | 1000EH | |
NULL | 1000FH | |
10010H | <--当栈为空时SS:SP指向这里 |
内存 | 地址 | 备注 |
NULL | 10000H | |
NULL | 10001H | |
NULL | 10002H | |
NULL | 10003H | |
NULL | 10004H | |
NULL | 10005H | |
NULL | 10006H | |
NULL | 10007H | |
NULL | 10008H | |
NULL | 10009H | |
NULL | 1000AH | |
NULL | 1000BH | |
NULL | 1000CH | |
NULL | 1000DH | |
34H | 1000EH | <--SS:SP=1000:E指向新的栈顶 |
12H | 1000FH | |
10010H |