ARM汇编--寻址方式

2020-02-12来源: eefocus关键字:ARM  汇编  寻址方式

ARM7TDMI(-S)具有32位ARM指令集和16位Thumb指令集。

RM指令集效率高,但是代码密度高

Thumb指令集具有较高的代码密度,却仍然保持着ARM的大多数性能上的优势,它是ARM的子集。


所有的ARM置零都是可以条件执行的,而Thumb置零仅有一条指令具备条件执行的功能。


ARM和Thumb程序可以相互调用,相互之间状态切换开销几乎为零。

 

首先我们来看一下分类:


一、数据处理指令操作数寻址方式

1、立即数寻址方式

2、寄存器寻址方式

3、寄存器移位寻址方式


二、存储器访问指令操作数寻址方式

1、寄存器间接寻址

2、基址变址寻址

3、相对寻址

4、多寄存器寻址(块拷贝寻址)

5、堆栈寻址


下面来一一介绍:

ARM有9种寻址方式

寻址方式:


1、立即寻址:

立即寻址指令中的操作码字段后面的部分就是操作数本省,也就是说,数据就包含再指令,取指令也就取出了可以立即使用的操作数。举例:

SUBS   R0,R0,#1              ;R0减1,结果放入R0中,并且影响标志位

MOV    R0,#0xFF000          ;将立即数0xFF000装入R0寄存器


ARM规定:这个立即数必须符合8位图格式,负责必须使用“文字池”方式,通过存储器访问指令加载,所谓的8位图格式就是指,这个数据能通过一个8bit的数循环右移偶数位得到。


2、寄存器寻址:        

操作数的值在寄存器中,指令中的地址字段指出的是寄存器的编号,指令执行的时候直出寄存器值来操作。举例:

MOV   R1,R2                ;将R2的值存入R1

MOV   R0,R1,R2              ;将R1的值减去R2的值,结构存到R0


3、寄存器移位寻址

寄存器移位寻址是ARM处理器特有的寻址方式。当第二个操作数是寄存器移位方式时,第二个操作数在与第一个操作数结合之前,选择进行移位操作。举例:

MOV    R0,R2,LSL #3      ;R2的值左移3位,结果放入R0,即R0=R2*8

ANDS  R1,R1,R2,LSL R3    ;R2的值左移R3位,然后和R1相"与"操作,结构放入R1


可采用移位操作的指令如下:


LSL左移、LSR右移、ASR算术右移、ROR循环右移、RRX带扩展的循环右移


4、寄存器间接寻址:

寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存再寄存器指定地址的存储单元中,即寄存器为操作数的地址指针,举例:

LDR   R1,[R2]          ;将R2指向的单元中的数据保存再R1中

SWP   R1,R1,[R2]       ;将寄存器R1的值和R2指向的单元中进行内容交换


5、基址变址寻址:

基址寻址就是将基址寄存器的内容与指令中给出的偏移量进行相加,形成操作数的有效地址。

基址寻址用于访问基址附近的存储单元,常用于查表、数组操作以及功能不见寄存器访问等   

举例:

LDR   R2,[R3,#0x0c]     ; 读取R3 0x0c地址指向的存储单元的内容,放入R2

STR   R1,[R0,#-4]!       ;先R0=R0-4,然后把R1的值寄存到R0所指向的单元中

LDR   R1,[R0,R3,LSL #1]  ;将R0 R3*2地址上的单元的内容读出,并存入R1中


6、相对寻址:

相对寻址是基址寻址的一种变通。由程序计数器PC提供基址地址,指令中的地址码字段为偏移量。两者相加后得到的地址即为操作数的有效地址。


7、多寄存器寻址:

多寄存器寻址即一次可传送几个寄存器的值,允许一条指令传送16个寄存器的任何子集或所有的存储器,举例:

LDMIA   R1!,{R2-R7,R12};将R1指向的单元中的数据读出到R2---R7、R12中(R1自自动 )

STMIA   R0!,{R2-R7,R12};将R2---R7、R12中的数据一次读入到R0指向的单元中(R0自动 )


8、堆栈寻址(块拷贝寻址):

堆栈是一种按特定顺序进行存取的存储区,操作顺序分为“先进后出”和“后进先出”,堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向的存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。


存储器堆栈可以分为两种:

向上生长:递增堆栈

向下生长:递减堆栈


还有从当前堆栈指针指向的内容是否有效可以分为:满递增、空递增、满递减、空递减

举例:

STMFD    SP!,{R1-R7,LR}    ;将R1---R7、LR入栈。满递减堆栈

LDMFD    SP!,{R1-R7,LR}    ;数据出栈,放入R1---R7、LR寄存器,满递减堆栈


问题:堆栈是先进后出   先把r1---r7放入堆栈中,再按照上述形式出栈,数据能还原么?还原了数据不是翻转了么

关键字:ARM  汇编  寻址方式 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic487958.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:ARM 指令集>>跳转指令
下一篇:为ARM编译Glib

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

海思ARM平台交叉编译zeroMQ
在使用海思的项目中要使用到ZeroMQ这个消息队列框架,之前在PC端使用感觉不错。所以通过要通过交叉编译,将其移植到ARM平台。移植方法,可以参考 https://blog.csdn.net/sishuihuahua/article/details/77203094  以下是我使用海思交叉编译工具的方法:一、配置编译器./configure --host=arm-himix100-linux --prefix=/opt/hisi-linux/zeromq-4.1.6/arm-zeromq  --without-libsodiumarm-himix100-linux   --host
发表于 2020-02-08
ARM常用汇编指令列表
发表于 2020-02-07
ARM常用汇编指令列表
ARM 处理器寻址方式之间接寻址的几种表达
我们以 LDR 指令为例来分别举例分析。LDR 指令的格式为:LDR{条件} 目的寄存器,<存储器地址>LDR 指令是字加载指令,用于从存储器中将一个 32 位的字数据送到目的寄存器中。该指令通常用于从存储器中读取 32 位的字数据到通用寄存器,然后对数据进行处理。当程序计数器 PC 作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。指令示例:LDR R3, [R4]             ; 将存储器地址为 R4 的字数据读入寄存器 R3LDR R3, [R1, #8]     
发表于 2020-02-07
ARM 汇编指令 DCD
简介DCD:数据定义( Data Definition )伪指令一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。语法格式:标号 DCD(或 DCDU) 表达式DCD(或 DCDU)伪指令用于分配一片连续的字存储单元并用指定的表达式初始化。其中表达式可以为程序标号或数字表达式。 DCD 也可用 “ &” 代替。用 DCD 分配的字存储单元是字对齐的,而用 DCDU 分配的字存储单元并不严格字对齐。实例(STM32 启动文件):__Vectors       DCD     __initial_sp     
发表于 2020-02-07
ARM 汇编指令 ADR 与 LDR 使用
简介这两个都是伪指令:ADR 是小范围的地址读取伪指令,LDR 是大范围的读取地址伪指令。可实际使用的区别是: ADR 是将基于 PC 相对偏移的地址值或基于寄存器相对地址值读取的伪指令,而 LDR 用于加载 32 位立即数或一个地址到指定的寄存器中。以下面的汇编代码为例:.global _start_start:    ldr r0, loop    adr r0, loop    ldr r0, =looploop:    nop用以下命令完成汇编、链接操作,并输出反汇编文件[root@localhost asm]# arm-linux-gcc
发表于 2020-02-07
arm架构64位(AArch64)汇编优化总结
调试和常用指令使用注意事项以及资料来源等相关知识。前文已有arm架构32位汇编优化总结对arm架构32位neon优化进行了全面总结,并且讲述了arm汇编语法,下面主要以gnu asm汇编语法为例讲述。下图为arm架构汇编优化总结的思维导图:3、arm架构64位优化基础知识【arm】arm架构64位入门基础:架构分析、寄存器、调用规则、指令集以及参考手册该博客已经分析了arm架构64位汇编优化的入门基础知识,主要包括架构分析,寄存器,调用规则,指令集和程序打印调试相关知识,可以作为入门arm64位汇编优化的基础知识。4、ARMv8/AArch64 neon指令格式In the AArch64 execution state, the
发表于 2020-02-07
arm架构64位(AArch64)汇编优化总结
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved