汇编(五)栈、CPU提供的栈机制、push、pop指令
时间:2023-12-18 点击:
次 来源:网络 作者:佚名 - 小 + 大
3.6 栈 - 栈是一种具有特殊的访问方式的存储空间,他的特殊性就在于 最后一个进入这个空间的数据,是最先出去的
-
栈有两种基本的操作:入栈和出栈 -
- 入栈:将一个新的元素放到栈顶
- 出栈:从栈顶取出一个元素
- 栈顶元素总是最后一个入栈的,需要出的时候,又会是第一个被取出的
-
操作规则:LIFO 3.7 CPU提供的栈机制 1. CPU如何知道一段内存空间被当做栈使用? -
有两个寄存器: - 段寄存器:SS 存放栈顶的段地址
- 寄存器:SP 存放栈顶的偏移地址
- 任意时刻 SS:SP指向栈顶元素
2. 执行push和pop的时候,如何知道那个单元是栈顶单元的? - push ax
-
- 先进行:SP = SP - 2
- 然后将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新的栈顶
- pop ax
-
- 先将栈顶(SS:SP)数据拿出来给ax
- 然后:SP = SP + 2
知识点: 3. CPU如何知道当前要执行的指令所在的位置? - 寄存器cs和ip中存放着当前执行的段地址和偏移地址
3.8 栈顶超界的问题 3.9 push、pop指令 -
push指令和pop指令是可以在寄存器和内存之间传送数据的 栈与内存: - 栈空间当然也是内存空间的一部分,它是一段可以以一种特殊方式进行访问的内存空间
- 栈只是一种数据结构的存放格式
-
push和pop的指令格式(1) -
- push 寄存器:将一个寄存器的数据入栈
- pop 寄存器: 出栈,用一个寄存器接受出栈的数据
-
如: -
push和pop的指令格式(2) -
- push 段寄存器:将一个段寄存器的数据入栈
- pop 段寄存器:出栈, 用一个段寄存器接受出栈的数据
-
如: -
push和pop的指令格式(3) -
- push 内存单元:将一对内存单元的数据入栈(栈操作都是以字为单位的)
- pop 内存单元:出栈, 用一对内存单元接受出栈的字单元数据
-
如: -
执行指令时,CPU要知道内存单元的地址,可以在push,pop指令中给出内存单元的偏移地址,段地址是在指令执行时,CPU从ds中自动获取的 段寄存器都是以S结尾的,通用寄存器都是以X结尾的 - 段地址在执行时可以从DS获得
- 数据的段地址永远是从DS获得
- 代码的段地址永远是从CS中获得
- 栈的段地址永远是从SS中获得
-
# 设置栈的段地址,ss=1000,不能直接向段寄存器送入数据,要通过ax通用寄存器传递mov ax, 1000mov ss, ax# 设置栈顶的偏移地址,因为栈为空,所以sp=0010mov sp, 0010# 压入数据push axpush bxpush ds -
mov ax, 1000mov ss, axmov sp, 0100mov ax=001amov bx=001bpush axpush bxsub ax, axsub bx, bxpop bxpop ax - 从上面的程序可以看到,用栈来暂存以后需要恢复的寄存器中的内存时,出栈的顺序要和入栈的顺序相反, 因为最后入栈的寄存器的内容在栈顶,所以在恢复时,是最先出栈的
-
mov bx, 1000mov ss, bxmov ap, 10mov ax, 002amov bx, 002bpush axpush bxpop axpop bx -
mov ax, 1000mov ss, axmov sp, 2mov ax, 226push, ax - Pop、和push实际上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与mov指令不同的是 push和pop指令访问的内存单元的地址不是在指令中给出,而是ss:p指出的
- 我们需要是十分清楚的是,push和pop指令同mov指令不同, CPU执行mov指令只需要一步, 而执行push、pop指令却需要两步操作
-
执行push时: -
执行pop时: - push、pop指令修改的只是sp,也就是说栈顶的变化范围最大为:0~FFFF(SP寄存器的大小)
- 在ss:sp中存放栈顶的段地址和偏移地址, 提供入栈和出栈指令, 他们根据ss:sp指示的地址, 按照栈的方式访问内存单元
- 任意时刻。ss:sp执行栈顶元素
- 8086CPU只记录栈顶, 栈空间的大小我们要自己管理
-
用栈来暂存以后需要恢复的寄存器的内容, 寄存器出栈的顺序要和 入栈相反 - 栈是一种非常重要的机制, 一定要深入理解, 灵活掌握
出处:http://www.hzhcontrols.com/new-714978.html
|