ARM指令寻址方式之: 内存访问指令寻址
的寄存器对应于内存中低地址单元,编号高的寄存器对应于内存中的高地址单元。
当指令执行条件满足并且指令编码格式中W位置位,基址寄存器Rn的值等于内存地址范围结束地址<end_address>。
(2)语法格式
LDM|STM{<cond>}IB <Rn>{!},<registers><^>
其中:
· IB标识指令使用"前增加"寻址方式;
· Rn为基址寄存器,包含内存访问的基地址;
· <registers>为指令操作的寄存器列表;
· <^>表示如果寄存器列表中包含程序计数器PC,是否将spsr拷贝到cpsr。
(3)操作伪代码
Start_address = Rn + 4
End_address = Rn + (Number_of_Set_Bits_In(register_list)*4)
If ConditionPassed(cond) and W= = 1 then
Rn = Rn + (Number_Of_Set_Bits_In(register_list)*4)
4.DB寻址
(1)编码格式
指令的编码格式如图4.34所示。

图4.34 批量Load/Store指令--前递减寻址
该寻址方式指定一片连续的内存地址空间,地址空间的大小<address_length>等于寄存器列表中寄存器数目的4倍。内存地址范围起始地址<start_address>等于基址寄存器Rn的值减地址空间的大小<address_length>。结束地址<end_address>等于基址寄存器的值减4。
地址空间中的每个内存单元对应寄存器列表中的一个寄存器。编号低的寄存器对应于内存中低地址单元,编号高的寄存器对应于内存中的高地址单元。
当指令执行条件满足并且指令编码格式中W位置位,基址寄存器Rn的值等于内存地址范围起始地址<address_address>。
(2)语法格式
LDM|STM{<cond>}DB <Rn>{!},<registers><^>
其中:
· DB标识指令使用"前递减"寻址方式;
· Rn为基址寄存器,包含内存访问的基地址;
· <registers>为指令操作的寄存器列表;
· <^>表示如果寄存器列表中包含程序计数器PC,是否将spsr拷贝到cpsr。
(3)操作伪代码
Start_address = Rn - (Number_Of_Set_Bits_In(register_list)*4)
End_address = Rn - 4
If ConditionPassed(cond) and W = = 1 then
Rn = Rn – (Number_Of_Set_Bits_In(register_list)*4)
4.2.4 堆栈操作寻址方式
堆栈操作寻址方式和批量Load/Store指令寻址方式十分类似。但对于堆栈的操作,数据写入内存和从内存中读出要使用不同的寻址模式,因为进栈操作(pop)和出栈操作(push)要在不同的方向上调整堆栈。
下面详细讨论如何使用合适的寻址方式实现数据的堆栈操作。
根据不同的寻址方式,将堆栈分为以下4种。
① Full栈:堆栈指针指向栈顶元素(last used location)。
② Empty栈:堆栈指针指向第一个可用元素(the first unused location)。
③ 递减栈:堆栈向内存地址减小的方向生长。
④ 递增栈:堆栈向内存地址增加的方向生长。
根据堆栈的不同种类,将其寻址方式分为以下4种。
① 满递减FD(Full Descending)。
② 空递减ED(Empty Descending)。
③ 满递增FA(Full Ascending)。
④ 空递增EA(Empty Ascending)。
| | 注意 | 如果程序中有对协处理器数据的进栈/出栈操作,最好使用FD或EA类型堆栈。这样可以使用一条STC或LDC指令将数据进栈或出栈。 |
表4.8显示了堆栈的寻址方式和批量Load/Store指令寻址方式的对应关系。
表4.8 堆栈寻址方式和批量Load/Store指令寻址方式对应关系
| 批量数据寻址方式 | 堆栈寻址方式 | L位 | P位 | U位 |
| LDMDA | LDMFA | 1 | 0 | 0 |
| LDMIA | LDMFD | 1 | 0 | 1 |
| LDMDB | LDMEA | 1 | 1 | 0 |
| LDMIB | LDMED | 1 | 1 | 1 |
| STMDA | STMED | 0 | 0 | 0 |
| STMIA | STMEA | 0 | 0 | 1 |
| STMDB | STMFD | 0 | 1 | 0 |
| STMIB | STMFA | 0 | 1 |
- ARM指令寻址方式之: 数据处理指令的寻址方式(08-13)
- ARM汇编指令ARM寻址方式、汇编指令、伪指令(11-20)
- 单片机的指令和寻址方式(11-13)
- ARM 指令的寻址方式(11-11)
- Linux嵌入式系统开发平台选型探讨(11-09)
- 基于ARM体系的嵌入式系统BSP的程序设计方案(04-11)

