汇编:关于栈的知识
1.入栈和出栈指令
2. SS与SP
3. 入栈与出栈
3.1 执行push ax ↑↑
3.2 执行pop ax ↓↓
3.3 栈顶超界的问题
4. 寄存器赋值
基于8086CPU编程时,可以将一段内存当作栈来使用。一个栈段最大可以设为64KB(0-FFFFH)。
1.入栈和出栈指令
- push(入栈)
- pop (出栈)
— push ax:将寄存器ax中的数据送入栈中
— pop ax:从栈顶取出数据送入ax
— 入栈和出栈操作都是以【字(16位)】为单位进行
— pop和push可以在寄存器和内存之间传送数据
2. SS与SP
8086CPU中,有两个寄存器
- SS:段寄存器,存放栈顶的段地址
- SP:寄存器,存放栈顶的偏移地址【专用寄存器】
任意时刻SS:SP指向栈顶元素。
若栈为空,sp指向最高地址单元的下一个单元。
3. 入栈与出栈
栈顶是低地址单元, 栈底是高地址单元。
3.1 执行push ax ↑↑
- sp=sp-2(偏移地址减少,即往低地址处偏移[栈顶方向])
- 将ax中的内容送入到ss:sp指向的内存单元
- ss:sp此时指向新栈顶
3.2 执行pop ax ↓↓
- 将ss:sp指向的内存单元的内容送入到ax中(取出的内容在内存中仍存在,并没有被重置,下一轮push会覆盖)
- sp=sp+2(偏移地址增加,即往高地址处偏移[栈底方向])
3.3 栈顶超界的问题
8086CPU没有记录栈顶上下限的寄存器,不保证栈的操作不会越界。栈空时pop出栈或当栈满时push入栈都会发生栈顶超界问题,操作到栈以外的数据。
4. 寄存器赋值
关于cs、ip、ss、sp、ds的赋值:
- 可以通过mov直接给sp赋值【立即数寻址】
- 不能通过mov给cs、ip、ss、ds赋值
- 给cs和ip赋值需要使用jum指令
- 给ss和ds赋值需要使用mov ss/ds, 寄存器;【寄存器寻址】