我是靠谱客的博主 深情斑马,最近开发中收集的这篇文章主要介绍【ARM 汇编&ARM 指令集】ARM 汇编&ARM 指令集  学习笔记,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

ARM 处理器寻址方式

1、寄存器寻址

操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值操作

MOV R1,R2 ;R2 -> R1
SUB R0,R1,R2 ;R1 - R2 -> R0

2、立即寻址

地址码部分就是操作数,(操作数)立即数就在指令中

SUBS R0,R0,#1 ;R0 – 1 -> R0
MOV R0,#0xff00 ;0xff00 -> R0

3、寄存器偏移寻址

MOV R0,R2,LSL #3 ;R2 的值左移3 位,结果放入R0,即R0 = R2 * 8
ANDS R1,R1,R2,LSL R3 ;R2 的值左移R3 位,然后和R1 相与操作,结果放入R1

4、寄存器间接寻址

寄存器为操作数的地址指针

LDR R1,[R2] ;将R2 中的数值作为地址,取出此地址中的数据保存在R1 中
SWP R1,R1,[R2];将如中的数值作为地址,取出此地址中的数值与R1 中的值交换

5、基址寻址

将基址寄存器的内容与偏移量相加,形成操作数的有效地址,用于访问寄存器附近存储单元

LDR R2,[R3,#0x0F] ;将R3 中的数值加0x0F 作为地址,取出此地址的数值保存在R2 中
STR R1,[R0,#-2] ;将R0 中的数值减2 作为地址,把R1 中的内容保存到此地址位置

6、多寄存器寻址

多寄存器寻址就是一次可以传送几个寄存器值,允许一条指令传送 16 个寄存器的任何子集或所有寄存器。

LDMIA R1!,{R2-R7,R12} ;将R1 单元中的数据读出到R2-R7,R12,R1 自动加1
STMIA R0!,{R3-R6,R10};将R3-R6,R10 中的数据保存到R0 指向的地址,R0 自动加1

7、堆栈寻址

堆栈是特定顺序进行存取的存储区,操作顺序分为“后进先出”和“先进后出”,
堆栈寻址时隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),
指针所指向的存储单元就是堆栈的栈顶。存储器堆栈可分为两种:
向上生长:向高地址方向生长,称为递增堆栈
向下生长:向低地址方向生长,称为递减堆栈
堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个要
放入的空位置,称为空堆栈。这样就有4 中类型的堆栈表示递增和递减的满堆栈和空堆
栈的各种组合。
满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的
最高地址。指令如LDMFA,STMFA 等。
空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空
位置。指令如LDMEA,STMEA 等。??????????????????

满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最
低地址。指令如LDMFD,STMFD 等。
空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空
位置。指令如LDMED,STMED 等。

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

8、块拷贝寻址

多寄存器传送指令用于一块数据从存储器的某一位置拷贝到另一位置。


块拷贝寻址指令举例如下:
STMIA R0!,{R1-R7} ;将R1~R7 的数据保存到存储器中,存储器指针在保存第一
                  ;个值之增加,增长方向为向上增长。
STMIB R0!,{R1-R7} ;将R1~R7 的数据保存到存储器中,存储器指针在保存第一
                  ;个值之增加,增长方向为向上增长。
STMDA R0!,{R1-R7} ;将R1~R7 的数据保存到存储器中,存储器指针在保存第一
                  ;个值之增加,增长方向为向下增长。
STMDB R0!,{R1-R7} ;将R1~R7 的数据保存到存储器中,存储器指针在保存第一
                  ;个值之增加,增长方向为向下增长。

9、相对寻址

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

BL ROUTE1 ;调用到ROUTE1 子程序
BEQ LOOP ;条件跳转到LOOP 标号处

LOOP MOV R2,#2    ;(PC+#2)->R2  


ROUTE1

二、ARM 指令集

【ARM <wbr>汇编&ARM <wbr>指令集】ARM <wbr>汇编&ARM <wbr>指令集 <wbr> <wbr>学习笔记

基本格式
<opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>}
其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须
的,而{<cond>}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。

opcode                     指令助记符,如LDR,STR 等cond                       执行条件,如EQ,NE 等S                          是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响Rd                         目标寄存器Rn                         第一个操作数的寄存器operand2                   第二个操作数


指令格式举例如下:
LDR R0,[R1]               ;读取R1 地址上的存储器单元内容,执行条件AL
BEQ DATAEVEN              ;跳转指令,执行条件EQ,即相等跳转到DATAEVEN
ADDS R1,R1,#1 ;            加法指令,R1+1=R1 影响CPSR 寄存器,带有SSUBNES R1,R1,#0xD;        条件执行减法运算(NE),R1-0xD=>R1,影响CPSR 寄存器,带有S

在 ARM 指令中,灵活的使用第2 个操作数能提高代码效率,第2 个操作数的形式如
下:
#immed_8r
常数表达式,该常数必须对应8 位位图,即常数是由一个8 位的常数循环移位偶数

MOV R0,#1 ;R0=1
AND R1,R2,#0x0F ;R2 与0x0F,结果保存在R1
LDR R0,[R1],#-4 ;读取R1 地址上的存储器单元内容,且R1=R1-4

Rm寄存器方式,在寄存器方式下操作数即为寄存器的数值。
寄存器方式应用举例:
SUB R1,R1,R2 ;R1-R2=>R1
MOV PC,R0 ;PC=R0,程序跳转到指定地址
LDR R0,[R1],-R2 ;读取R1 地址上的存储器单元内容并存入R0,且R1=R1-R2

Rm,shift寄存器移位方式。将寄存器的移位结果作为操作数,但 RM 值保存不变,移位方法
如下:
ASR #n 算术右移n 位(1≤n≤32)
LSL #n 逻辑左移n 位(1≤n≤31)
LSR #n 逻辑左移n 位(1≤n≤32)
ROR #n 循环右移n 位(1≤n≤31)
RRX 带扩展的循环右移1 位
type Rs 其中,type 为ASR,LSL,和ROR 中的一种;Rs 偏移量寄存器,低8
位有效,若其值大于或等于32,则第2 个操作数的结果为0(ASR、ROR
例外)。
寄存器偏移方式应用举例:
ADD R1,R1,R1,LSL #3 ;R1=R1*9

SUB R1,R1,R2,LSR#2 ;R1=R1-R2*4
R15 为处理器的程序计数器PC,一般不要对其进行操作,而且有些指令是不允许使
用R15,如UMULL 指令

条件码使用指令条件码,可实现高效的逻辑操作,提高代码效率。

【ARM <wbr>汇编&ARM <wbr>指令集】ARM <wbr>汇编&ARM <wbr>指令集 <wbr> <wbr>学习笔记

对于Thumb 指令集,只有B 指令具有条件码执行功能,此指令条件码同表2.1,但如果为无条件执行时,条件码助记符“AL”不能在指令中书写。

条件码应用举例如下:
比较两个值大小,并进行相应加1 处理,C 代码为
if(a>b)a++;
else b++;


对应的ARM 指令如下。其R0 为a,R1 为b。
CMP R0,R1 ;             R0 与R1 比较
ADDHI R0,R0,#1 ;       若R0>R1,则R0=R0+1
ADDLS R1,R1,#1 ;       若R0<=R1,则R1=R1+1


若两个条件均成立,则将这两个数值相加,C 代码为

If((a!=10)&&(b!=20)) a=a+b;


对应的ARM 指令如下.其中R0 为a,R1 为b.
CMP R0,#10 ;比较R0 是否为10
CMPNE R1,#20 ;若R0 不为10,则比较R1 是否20
ADDNE R0,R0,R1 ;若R0 不为10 且R1 不为20,指令执行,R0=R0+R1

ARM 存储器访问指令

ARM是RISC 处理器,对存储器的访问只能使用加载和存储指令实现。

最后

以上就是深情斑马为你收集整理的【ARM 汇编&ARM 指令集】ARM 汇编&ARM 指令集  学习笔记的全部内容,希望文章能够帮你解决【ARM 汇编&ARM 指令集】ARM 汇编&ARM 指令集  学习笔记所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部