<汇编语言> 3. 寄存器
栈基本结构
SS:SP 永远是栈顶!
栈是一种具有特殊访问方式的一段存储空间。
栈的本质是存储,就是一段内存。特性是只能通过 push, pop 指令 访问
段寄存器 SS : 栈顶的段地址
寄存器 SP : 栈顶的偏移地址
当前的栈顶: SS - SP
push ax 将 ax 中的数据送入栈中
pop ax 将栈顶数据送入 ax
8086 入栈出栈都是以字为单位
PUSH :
1) 指针上移: SP 减 2 ,SS-SP 则加 2, 栈顶变大
2) 在新的 SS-SP 位置开始写入数据
POP :
1) 先把数据取出
2) 指针下移:SP 加 2 ,SS-SP 则减 2,栈顶变小
3) 原地址上的数据还是存在的,只是这时不再用了,下次push后就会覆盖,这时修改指针还可以恢复
空栈时, SP 指向空栈最高位的下一个单元,(栈可以想象成一个弹夹,子弹是从最高位开始往下装 ,还没装自然就是最高位外面)
怎么定义一个栈的地址范围:
栈顶 : SS + SP
栈空间: 在x86架构(包括8086)的汇编语言中,栈空间是由操作系统在程序启动时设置的,通常是通过初始化SS(栈段)和SP(栈指针)寄存器来实现的。SS寄存器指向栈段的基地址,而SP寄存器则指向栈顶。
栈顶越界问题
如果 pop 一个空栈会发生什么: 越界 !
如果 push一个满栈会发生什么: 越界 !
push, pop
push, pop 栈操作只修改 SP, 所以栈顶的最大变化范围 0 ~ FFFFH
通用寄存器
# push 寄存器
push ax # 将ax中的数据压入栈中
# pop 寄存器
pop bx # 将栈顶数据传入bx中的数据,栈顶下移2
段寄存器
# push 段寄存器
push ds
# pop 段寄存器
pop es
内存单元
cpu 从 ds 中取出 段地址
# push 内存单元: 将一个内存单元处的字(两个字节)入栈
push [0] # ds:[0]
# pop 内存单元: 出栈,用一个内存单元接收出栈的数据
pop [0] # ds:[2]