初学ARM指令时,假如从字面上了解满仓库和空仓库很有可能会曲解它们的意思。能够幻想一下,“满仓库”便是一个满的仓库,不能再存储数据了;而“空仓库”便是一个空的仓库,没有被运用的仓库,呵呵,这样了解的话那就错了。
实践上“满仓库”和“空仓库”确切的说应该是“满栈”或许是“空栈”,咱们仅仅习惯了把栈叫做仓库。而二者深层的意思是说的“方位”或许“地址”,而不是“仓库”。假如叫“满方位”或许“空方位”更简单了解一些。下面是《ARM嵌入式体系开发 –软件设计与优化》书中给的解说:
满仓库(full stack,“F”)是指仓库指针指向仓库的最终一个已运用的地址或许满方位(也便是sp指向仓库最终一个数据项方位)。
空仓库(empty stack,”E”)是指sp指向仓库的第一个没有运用的地址或许空方位(也便是说sp指向仓库最终一个数据项的下一个方位)。
满仓库的关键词是最终一个已运用的地址,空仓库是第一个没有运用的地址。
存储器仓库能够分为两种:
一种是向上成长,便是向着高地址方向成长,称为递加仓库。
一种是向下成长,便是向着低地址方向成长,称为递减仓库。
这样,就有四种组合:满递加(FA)、空递加(EA)、满递减(FD)、空递减(ED)。
入栈规则:
(1)满仓库操作先调整SP,然后存入数据。
(2)空仓库操作先存入数据,然后调整SP。
(3)递加仓库调整SP时,履行SP=SP+4
(4)递减仓库调整SP时,履行SP=SP-4
出栈规则正好与入栈相反,也便是入栈的逆操作。
(1)空仓库操作先调整SP,然后存入数据。
(2)满仓库操作先存入数据,然后调整SP。
(3)递减仓库调整SP时,履行SP=SP+4
(4)递加仓库调整SP时,履行SP=SP-4
清晰了这四个规则,就很简单剖析各种仓库寻址方法对应的仓库散布状况了。
stmfd sp!, {r4-r11}
stmed sp!, {r4-r11}
实践运用中,只选用一种方法运用就能够了。最常用最典型的便是后缀为“FD”时的结构,这是人们了解的仓库结构。
stmfd sp!, {r4-r11, lr}
ldmfd sp!, {r4-r11, lr}
例1:
PRE
r1 = 0X00000002
r4 = 0x00000003
sp = 0x00080014
STMFD sp!, {r1, r4}
POST
r1 = 0X00000002
r4 = 0x00000003
sp = 0x0008000c
例2
PRE
r1 = 0X00000002
r4 = 0x00000003
sp = 0x00080010
STMFD sp!, {r1, r4}
POST
r1 = 0X00000002
r4 = 0x00000003
sp = 0x00080008