<汇编语言> 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]
posted @ 2024-04-09 09:45  Leon大帝  阅读(6)  评论(0编辑  收藏  举报