历史上的今天
返回首页

历史上的今天

今天是: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微处理器支持这四种类型的堆栈工作方式,即:

-满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。-满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。

-空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。-空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。


推荐阅读

史海拾趣

全志(Allwinner)公司的发展小趣事

近年来,全志科技积极寻求与其他行业的合作,共同推进技术的创新和应用。例如,全志与安克创新建立了战略合作伙伴关系,在AI技术在智能硬件领域的创新研究、落地应用和推广方面展开了深入合作。这种合作模式不仅提升了全志的科技实力和市场影响力,也为公司的未来发展注入了新的活力。

以上五个故事分别展示了全志科技在创始与崛起、技术突破与市场认可、抓住市场风口、产品线拓展与战略转型以及合作与共赢等方面的发展历程。这些故事共同构成了全志科技在电子行业中的成长轨迹,也展示了其在面对市场挑战和机遇时的应对策略和决心。

Bipolarics Inc公司的发展小趣事

在快速发展的过程中,Bipolarics Inc始终重视人才培养和团队建设。公司注重从高校和研究机构引进优秀人才,同时加强内部员工的培训和晋升机制。通过打造一支高效、专业的团队,Bipolarics Inc在技术研发、市场营销等方面取得了显著成绩。此外,公司还积极营造良好的企业文化氛围,激发员工的创新精神和团队凝聚力。

BULGIN公司的发展小趣事

随着技术的不断进步和市场的扩大,BULGIN公司在20世纪60年代成为了当时世界上最大的、产品线最为齐全的电子零件制造商之一。公司保持着快速的创新与发展,BULGIN品牌开始覆盖多国市场,为全球各地的客户提供优质的产品和服务。

AMRI Enterprise Co Ltd公司的发展小趣事

AMRI Enterprise Co Ltd注重与高校和研究机构的产学研合作,通过引进先进技术和人才,推动公司的技术创新。公司与多所知名高校建立了紧密的合作关系,共同开展科研项目和技术攻关。这些合作不仅为AMRI带来了前沿的技术成果,还提升了公司的研发能力和创新能力。在产学研合作的推动下,AMRI不断推出具有创新性和竞争力的新产品,为公司的持续发展提供了强有力的支撑。

Holy Stone公司的发展小趣事

Holy Stone企业股份有限公司创立于1981年,总部位于台北市。创立之初,公司凭借创办人深厚的电子技术背景,迅速在电子元件市场站稳脚跟。起初,Holy Stone主要作为专业的电子零件代理商,为客户提供专业的技术服务与解决方案。这一阶段,公司通过扎实的专业技术基础和敏锐的市场洞察力,逐步建立起稳定的客户基础,为后续的发展奠定了坚实的基础。

Automatic Connector公司的发展小趣事

为了保持技术创新的活力,Automatic Connector公司积极与高校和研究机构开展产学研合作。通过与这些机构的深度合作,公司能够及时了解最新的科研成果和技术趋势,为产品的研发和创新提供有力的支持。同时,公司还为合作机构提供实践平台和技术支持,实现了资源共享和互利共赢。这种产学研合作的模式为Automatic Connector公司的创新发展注入了强大的动力。

这五个故事虽然是以虚构的Automatic Connector公司为背景,但它们所反映的电子连接器制造企业的发展规律和市场环境是真实存在的。希望这些故事能够为您了解电子行业中的企业发展提供一些启示。

问答坊 | AI 解惑

戏法人人会变,各有巧妙不同--用有限状态机对键盘模块的另类实现

最近阿姨家里的几个表哥都在热烈的讨论着状态机,表弟我心痒,也想来凑凑热闹。要想加入他们的讨论,首先得明白什么是状态机,这是今天的主题之一,不过我会首先给出定义,然后谈谈我的浅薄的理解。另外,前些日子正在学习GOF的《设计模式》,其中 ...…

查看全部问答>

【转】一个工程师有关FPGA项目的感言

1. 要和人配合。以我们做硬件的工程师为例,测试的时候一般都需要软件的配合,一个对硬件来说无比复杂的工作,可能在软件工程师看来就是几行简单的代码。所以要和人配合,多听听别人的意见,这样必然可以产生新的 know-how 从而加快测试和开发的速 ...…

查看全部问答>

三说锂电池:到底市场有多大?2010有哪些大行动?

很多资料提到中国政府规划2012年中国将形成50万辆新能源汽车产能,形成10亿安时的车用高新能单体动力电池生产能力。我们来估算,以单车使用2万元电池(综合考虑混合动力和纯电动汽车)的平均水平测算,国内汽 车动力电池市场规模可达 ...…

查看全部问答>

OSCPUSaveSR 这个函数有什么用?

        mrs r0,CPSR         orr r1,r0,#NOINT         msr CPSR_c,r1         mov pc,lr 刚学UCOS,这段汇编怎么 ...…

查看全部问答>

pb下编译电源管理(PM.dll)模块问题

\\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 ...…

查看全部问答>

请问2407这样地址译码行吗?

用一块cy7c1021做ram扩展 strb-接ce- we-接we- rd-接oe- ps-接a15 现在好像译码有问题得 请老师看一下,谢谢…

查看全部问答>

论坛可不可以组织做一些LaunchPad教程,各位新手来啊

手把手,一步一步的图文教程。 做各种试验。 比如按键,跑马灯, 中断。串口, 计时器,计数器,看门狗。 。。。。 等等。 新手,手拿LaunchPad不知道怎么整,太复杂了的教程又看不懂。 [ 本帖最后由 smallbird 于 2011-9-27 20:21 编辑 ]…

查看全部问答>

怎么在IAR编译器里面获得当前的时间

怎么在IAR编译器里面获得当前的时间(年月日小时分钟秒)? \0\0\0eeworldpostqq…

查看全部问答>