Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7985
  • 博文数量: 3
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 15
  • 用 户 组: 普通用户
  • 注册时间: 2020-09-24 22:33
文章分类
文章存档

2020年(3)

我的朋友

分类: 嵌入式

2020-09-25 08:48:55

 初学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

   

阅读(1336) | 评论(0) | 转发(0) |
0

上一篇:多寄存器寻址指令ldmia/ldmib。。。。。

下一篇:没有了

给主人留下些什么吧!~~