微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第11章 栈(X86汇编教程)

第11章 栈(X86汇编教程)

时间:12-01 来源:互联网 点击:
,是什么呢?其实啊,栈,就是一种数据放进内存和从内存读取出来的方法.用栈来操作数据,几乎无需自己操心数据会被保存在内存的什么地方(不出意外的话.....)

栈操作内存的方法是写入的时候把数据一个一个推进去,写一次推一个数据.而提取数据当然也是一个一个提取出来.注意:提取过的数据就会消失(实际上没有消失,可以再次提取,但....那还不如直接用正常方式操作内存呢..).不像普通内存操作可以反复读取.栈提供了一种"后进先出"的数据操作方法.把最后放进内存的数据最先拿出来.这种内存操作方法在某些方面会有巨大的用处.

使用栈来操作内存,先在内存中定义一个位置,作为"栈顶",这个定义的方法也没啥,直接把你要作为栈顶的内存地址写进SS:SP寄存器即可.这2个寄存器就是"栈顶指针寄存器组合" (一般系统会自动定义栈顶,无需自己操作,所以这步可以跳过,知道SS:SP寄存器的作用即可.)

我们用堆栈往内存里面推入数据之后,栈顶就会移动(自动的哟!).所以不用担心会把曾经推进堆栈的数据覆盖(当然,你可别因为这样就拼命往堆栈里边压数据...内存会爆掉的[=_=0])

CPU用堆栈操作内存的步骤:

数据入栈:

1:往内存的[SS:SP]写入数据

2:新的SP寄存器值=SP寄存器值-入栈数据的长度(单位:字节,一般是字形数据.也就是2个字节)

数据出栈:

1:SP寄存器值+出栈数据的长度(同上个括号)

2:在[SS:SP]读取数据

然后,用栈操作指令就能把数据推进栈里,或从栈里把数据弄出来....


指令名 :PUSH

操作数数量:1

操作数名 :数据

指令用途 :把一个数据推进栈里,可以是直接数,也可以是寄存器或内存地址(内存地址的话需要指定推进堆栈里的数据长度)



指令名 :POP

操作数数量:1

操作数名 :存放数据的地方

指令用途 :把一个数据从堆栈里提取出来.可以放到寄存器或内存地址里.(此处内容同上面那个括号)


实例:

PUSH AX;把AX里面的数据推进堆栈里

POP BX;把最后推进堆栈的数据读取出来放进BX

内存地址实例:

PUSH WORD [DS:0];那个WORD就是用来指定数据长度的,字形(WORD)为2个字节

POP DWORD [DS:0];4个字节出栈

本章就到这里,作业:把4个通用寄存器[AX BX CX DX]都压栈再取回吧!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top