ARM指令寻址方式之: 内存访问指令寻址
(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指令将数据进栈或出栈。 |
评论