第11章 栈(X86汇编教程)
栈操作内存的方法是写入的时候把数据一个一个推进去,写一次推一个数据.而提取数据当然也是一个一个提取出来.注意:提取过的数据就会消失(实际上没有消失,可以再次提取,但....那还不如直接用正常方式操作内存呢..).不像普通内存操作可以反复读取.栈提供了一种"后进先出"的数据操作方法.把最后放进内存的数据最先拿出来.这种内存操作方法在某些方面会有巨大的用处.
使用栈来操作内存,先在内存中定义一个位置,作为"栈顶",这个定义的方法也没啥,直接把你要作为栈顶的内存地址写进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]都压栈再取回吧!
栈X86汇编教 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)