分享

第11章 栈(X86汇编教程)

 共同成长888 2015-07-19

第11章 栈(X86汇编教程) 


本X86汇编教程目录 http://www./mcu/2619.html

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

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

    使用栈来操作内存,先在内存中定义一个位置,作为"栈顶",这个定义的方法也没啥,直接把你要作为栈顶的内存地址写进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]都压栈再取回吧!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多