满堆栈与空堆栈

     初学ARM指令时,如果从字面上理解满堆栈和空堆栈很有可能会歪曲它们的意思。可以想象一下,“满堆栈”就是一个满的堆栈,不能再存储数据了;而“空堆栈”就是一个空的堆栈,没有被使用的堆栈,呵呵,这样理解的话那就错了。

    实际上“满堆栈”和“空堆栈”确切的说应该是“满栈”或者是“空栈”,我们只是习惯了把栈叫做堆栈。而二者深层的意思是说的“位置”或者“地址”,而不是“堆栈”。如果叫“满位置”或者“空位置”更容易理解一些。下面是《ARM嵌入式系统开发 --软件设计与优化》书中给的解释:

    满堆栈(full stack,“F”)是指堆栈指针指向堆栈的最后一个已使用的地址或者满位置(也就是sp指向堆栈最后一个数据项位置)。

    空堆栈(empty stack,"E")是指sp指向堆栈的第一个没有使用的地址或者空位置(也就是说sp指向堆栈最后一个数据项的下一个位置)。

    满堆栈的关键词是最后一个已使用的地址,空堆栈是第一个没有使用的地址。

 

 

  


 

    ARM体系结构使用多寄存器指令load-store来完成堆栈操作。在指令上加上后缀FA、FD、EA、ED(F-满位置,E-空位置,-递增,D-递减)来表示sp指针的寻址方式,如FA表示递增满。

 

    下面是 《ARM嵌入式系统开发 --软件设计与优化》书中的两个例子,但是第一个例子好像是有错误。将sp=0x00080014写成了0x00000004,这里改正过来了。其中1例子说明满栈,2例子说明了空栈。

    例1

STMFD指令

 

PRE

     r1 = 0X00000002

     r4 = 0x00000003

     sp = 0x00080014

 

    STMFD sp!, {r1, r4}

 

POST

     r1 = 0X00000002

     r4 = 0x00000003

     sp = 0x0008000c

 

    例2

STMED指令对应的sp指针移动

PRE

     r1 = 0X00000002

     r4 = 0x00000003

     sp = 0x00080010

 

    STMFD sp!, {r1, r4}

 

POST

     r1 = 0X00000002

     r4 = 0x00000003

     sp = 0x00080008

   

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值