历史上的今天
今天是:2025年01月11日(星期六)
2021年01月11日 | ARM指令寻址方式
2021-01-11 来源:eefocus
3.2ARM指令的寻址方式
所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。目前ARM指令系统支持如下几种常见的寻址方式。
ARM应用系统开发详解──基于S3C4510B的系统设计3
3.2.1立即寻址
立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下指令:
ADDR0,R0,#1
;R0←R0+1
ADDR0,R0,#0x3f;R0←R0+0x3f
在以上两条指令中,第二个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”或“&”。
3.2.2寄存器寻址
寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令:
ADDR0,R1,R2;R0←R1+R2
该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。
3.2.2寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:
ADDR0,R1,[R2];R0←R1+[R2]LDRR0,[R1];R0←[R1]STRR0,[R1]
;[R1]←R0
在第一条指令中,以寄存器R2的值作为操作数的地址,在存储器中取得一个操作数后与R1相加,结果存入寄存器R0中。
第二条指令将以R1的值为地址的存储器中的数据传送到R0中。第三条指令将R0的值传送到以R1的值为地址的存储器中。
3.2.3基址变址寻址
基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令常见有以下几种形式,如下所示:
LDRR0,[R1,#4];R0←[R1+4]LDRR0,[R1,#4]!;R0←[R1+4]、R1←R1+4LDRR0,[R1],#4;R0←[R1]、R1←R1+4
LDRR0,[R1,R2]
;R0←[R1+R2]
在第一条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中。
在第二条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。
在第三条指令中,以寄存器R1的内容作为操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。
在第四条指令中,将寄存器R1的内容加上寄存器R2的内容形成操作数的有效地址,从而取得操作数存入寄存器R0中。
ARM应用系统开发详解──基于S3C4510B的系统设计4
3.2.4多寄存器寻址
采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。以下指令:
LDMIAR0,{R1,R2,R3,R4};R1←[R0];R2←[R0+4];R3←[R0+8]
;R4←[R0+12]
该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1~R4。
3.2.5相对寻址
与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:
BLNEXT;跳转到子程序NEXT处执行……
NEXT
……
MOVPC,LR
;从子程序返回
3.2.6堆栈寻址
堆栈是一种数据结构,按先进后出(FirstInLastOut,FILO)的方式工作,使用一个称作堆栈
指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。
当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(FullStack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(EmptyStack)。
同时,根据堆栈的生成方式,又可以分为递增堆栈(AscendingStack)和递减堆栈(DecendingStack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有四种类型的堆栈工作方式,ARM微处理器支持这四种类型的堆栈工作方式,即:
-满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。-满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。
-空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。-空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。
下一篇:总结ARM会遇到的问题
史海拾趣
|
戏法人人会变,各有巧妙不同--用有限状态机对键盘模块的另类实现 最近阿姨家里的几个表哥都在热烈的讨论着状态机,表弟我心痒,也想来凑凑热闹。要想加入他们的讨论,首先得明白什么是状态机,这是今天的主题之一,不过我会首先给出定义,然后谈谈我的浅薄的理解。另外,前些日子正在学习GOF的《设计模式》,其中 ...… 查看全部问答> |
|
1. 要和人配合。以我们做硬件的工程师为例,测试的时候一般都需要软件的配合,一个对硬件来说无比复杂的工作,可能在软件工程师看来就是几行简单的代码。所以要和人配合,多听听别人的意见,这样必然可以产生新的 know-how 从而加快测试和开发的速 ...… 查看全部问答> |
|
很多资料提到中国政府规划2012年中国将形成50万辆新能源汽车产能,形成10亿安时的车用高新能单体动力电池生产能力。我们来估算,以单车使用2万元电池(综合考虑混合动力和纯电动汽车)的平均水平测算,国内汽 车动力电池市场规模可达 ...… 查看全部问答> |
|
mrs r0,CPSR orr r1,r0,#NOINT msr CPSR_c,r1 mov pc,lr 刚学UCOS,这段汇编怎么 ...… 查看全部问答> |
|
\\WINCE500\\PUBLIC\\COMMON\\OAK\\DRIVERS\\PM\\PDD下有两个目录,一个是default,另一个是pda,前者是默认的电源管理代码,后者是适用于pda的,但编译生成OS时,只会将前者生成的库pm_default_pdd_lib链接到pm.dll,而后者生成的库pm_pda_pdd_lib ...… 查看全部问答> |
|
本人一直搞net开发,搞了两年,对WEB开发算是比较熟悉。 现在感觉技术很难上去, 想向嵌入式编程发展,有哪位师傅能带带,报酬另算。 地点在广州 电话:13711179572 小第万分感谢!!!… 查看全部问答> |
|
我用的是platform builder 4.2,建立的一个dll项目,作为网卡驱动。在ddk的ndis.h文件中有这样的定义: typedef struct _NDIS30_MINIPORT_CHARACTERISTICS { UCHAR &n ...… 查看全部问答> |
|
手把手,一步一步的图文教程。 做各种试验。 比如按键,跑马灯, 中断。串口, 计时器,计数器,看门狗。 。。。。 等等。 新手,手拿LaunchPad不知道怎么整,太复杂了的教程又看不懂。 [ 本帖最后由 smallbird 于 2011-9-27 20:21 编辑 ]… 查看全部问答> |




