新闻中心

EEPW首页>嵌入式系统>设计应用> ARM指令寻址方式之: 内存访问指令寻址

ARM指令寻址方式之: 内存访问指令寻址

作者: 时间:2013-09-13 来源:网络 收藏

本文引用地址://m.amcfsurvey.com/article/257083.htm

(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指令将数据进栈或出栈。



评论


相关推荐

技术专区

关闭