您的位置 首页 编程

常用的ARM汇编指令

MRS(读状态寄存器)MRSr1,CPSR;CPSR—>r1MSR(写状态寄存器)MSRcpsr_c,0xD3;CPSR[70]=0xD3STMFDSP!

MRS (读状况寄存器) MRS r1, CPSR ; CPSR—>r1

MSR (写状况寄存器) MSR cpsr_c, #0xD3 ; CPSR[7…0] = 0xD3

STMFD SP! {R8-R9}

意义:(1)SP=SP-4字节 (2) R9—>SP (3)SP=SP-4 (4) R8–>SP

LDMFD SP! {R8-R9,PC}

意义:(1)SP–>R8 (2)SP=SP+4 (3)SP–>R9 (4)SP=SP+4 (5)SP–>PC (6) SP=SP+4

ldmia sp!{ r0-r7pc }^^ 表明将spsr的值赋给cpsr

B lable 跳转指令 PC<---lable

BL lable 带链接跳转指令 LR<----PC-4, PC<---lable

BXRm 带状况切换跳转指令 PC<----Rm ,切换状况(Rm[0]=1,thumb,Rm[0]=0,ARM)

%F2 表明跳转到当时指令后边的标号2处

%B0 表明跳转到当时指令前面的标号0处

[ —– IF; | —– ELSE; ] —– ENDIF

IF logical expression [logical expression

InstructionsInstructions

{ELSE |

Instructions Instructions

} ]

ENDIF

(1)GBLL 伪指令用于界说一个大局的逻辑变量,并初始化为{False}。
GBLL BOOTLOADER
BOOTLOADER SETL {TRUE}

(2)GET(或 INCLUDE)
GET 伪指令用于将一个源文件包括到当时的源文件中,并将被包括的源文件在当时方位进行汇编处理。能够运用 INCLUDE 替代 GET。
INCLUDE ..//..//kernel//oal//startup.s

(3)IMPORT 伪指令用于告诉编译器要运用的标号在其他的源文件中界说,但要在当时源文件中引证,并且不管当时源文件是否引证该标号,该标号均会被加入到当时源文件的符号表中。
IMPORT BootloaderMain
IMPORT MMUSetup
(4)BL 带回来的跳转指令
(5)BEQ表明“持平则跳转”,即当CPSR中的Z标志置位时发生跳转
B Label ;程序无条件跳转到标号Label处履行
CMP R1,#0 ;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label处履行
BEQ Label

(6)LDR 指令的格局为:
LDR{条件} 意图寄存器,<存储器地址>
LDR 指令用于从存储器中将一个 32 位的字数据传送到意图寄存器中。该指令一般用于从存储器中读取 32 位的字数据到通用寄存器,然后对数据进行处理。当程序计数器 PC 作为意图寄存器时,指令从存储器中读取的字数据被当作意图地址,然后能够完结程序流程的跳转。
指令示例:
LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。
LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。
LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。
LDR R0,[R1,R2] ! ;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1
LDR R0,[R1,#8] ! ;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。
LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。
LDR R0,[R1,R2,LSL#2]! ;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

(7)STR 指令的格局为:
STR{条件} 源寄存器,<存储器地址>
STR 指令用于从源寄存器中将一个 32 位的字数据传送到存储器中。与LDR对应

(8)选用多寄存器寻址方法,一条指令能够完结多个寄存器值的传送。这种寻址方法能够用一条指令完结传送最多 16 个通用寄存器的值。以下指令:
LDMIA R0,{R1,R2,R3,R4} ;R1←[R0]
;R2←[R0+4]
;R3←[R0+8]
;R4←[R0+12]
该指令的后缀 IA表明在每次履行完加载/存储操作后,R0 按字长度添加,因而,指令可将接连存储单元的值传送到 R1~R4。

(9)SBC 指令的格局为:
SBC{条件}{S} 意图寄存器,操作数 1,操作数 2
SBC指令用于把操作数1减去操作数2,再减去 CPSR 中的C 条件标志位的反码,并将成果存放到意图寄存器中。操作数1应是一个寄存器,操作数2能够是一个寄存器,被移位的寄存器,或一个当即数。该指令运用进位标志来表明借位,这样就能够做大于 32 位的减法。留意不要忘掉设置 S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。
指令示例:
SUBS R0,R1,R2 ; R0 = R1 – R2 – !C,并依据成果设置CPSR的进位标志位

(10)BX 带状况切换的跳转指令

(11)MCR 指令的格局为:
MCR{条件} 协处理器编码,协处理器操作码 1,源寄存器,意图寄存器 1,意图寄存器 2,协处理器操作码 2
MCR 指令用于将 ARM 处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完结操作,则发生未界说指令反常。其间协处理器操作码1和协处理器操作码2为协处理器即将履行的操作,源寄存器为 ARM 处理器的寄存器,意图寄存器1和意图寄存器2均为协处理器的寄存器。
指令示例:
MCR P3,3,R0,C4,C5,6 ;该指令将ARM处理器寄存器R0中的数据传送到协处理器P3的寄存器C4和C5中。

(12)CMP 指令的格局为:
CMP{条件} 操作数 1,操作数 2
CMP 指令用于把一个寄存器的内容和另一个寄存器的内容或当即数进行比较,一起更新 CPSR 中条件标志位的值。该指令进行一次减法运算,但不存储成果,只更改条件标志位。标志位表明的是操作数 1 与操作数 2 的联系(大、小、持平),例如,当操作数 1 大于操作操作数 2,则尔后的有 GT 后缀的指令将能够履行。
指令示例:
CMP R1,R0 ;将寄存器R1的值与寄存器R0的值相减,并依据成果设置CPSR的标志位
CMP R1,#100 ;将寄存器R1的值与当即数100相减,并依据成果设置CPSR的标志位

(13)批量数据加载/存储指令LDM(或 STM)指令的格局为:
LDM(或 STM){条件}{类型} 基址寄存器{!},寄存器列表{∧}
LDM(或 STM)指令用于从由基址寄存器所指示的一片接连存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用处是将多个寄存器的内容入栈(SDM)或出栈(LDM)。其间,{类型}为以下几种状况:
IA 每次传送后地址加 1;
IB 每次传送前地址加 1;
DA 每次传送后地址减 1;
DB 每次传送前地址减 1;
FD 满递减仓库;
ED 空递减仓库;
FA 满递加仓库;
EA 空递加仓库;
{!}为可选后缀,若选用该后缀,则当数据传送结束之后,将最终的地址写入基址寄存器,不然基址寄存器的内容不改动。

STMFD R13!,{R0,R4-R12,LR} ;将寄存器列表中的寄存器(R0,R4 到R12,LR)存入仓库
LDMFD R13!,{R0,R4-R12,PC} ;将仓库内容康复到寄存器(R0,R4到R12,LR)

(14)ORR 指令的格局为:
ORR{条件}{S} 意图寄存器,操作数 1,操作数 2
ORR 指令用于在两个操作数上进行逻辑或运算,并把成果放置到意图寄存器中。操作数 1
应是一个寄存器,操作数 2 能够是一个寄存器,被移位的寄存器,或一个当即数。该指令常用于设置操作数 1 的某些位。
指令示例:
ORR R0,R0,#3 ; 该指令设置R0的0、1位,其他位坚持不变。

(15)BIC 指令的格局为:
BIC{条件}{S} 意图寄存器,操作数 1,操作数 2
BIC指令用于铲除操作数1 的某些位,并把成果放置到意图寄存器中。操作数 1 应是一个寄存器,操作数 2 能够是一个寄存器,被移位的寄存器,或一个当即数。操作数 2 为 32 位的掩码,如果在掩码中设置了某一位,则铲除这一位。未设置的掩码位坚持不变。
指令示例:
B%&&&&&% R0,R0,#%1011 ; 该指令铲除 R0 中的位 0、1、和 3,其他的位坚持不变。

(16)
ADR(小规模的地址读取伪指令)
ADRL(中等规模的地址读取伪指令)
LDR(大规模的地址读取伪指令)
ldr r0, =0xFFFFC000
用于将根据PC的地址或根据寄存器的地址读取到寄存器中。
///伪指令经过汇编编译器替换成对应的ARM/Thumb 指令。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/276768.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部