ARM指令集小记

来源:互联网 发布:知我药妆官方旗舰店 编辑:程序博客网 时间:2024/06/16 21:20

Arm七种操作模式:

用户(usr)、系统(sys)、快中断(fiq)、中断(irq)、管理(svc)、中止(abt)、未定义(und

MOV        R1R0                    ;将寄存器R0的值传送到寄存器R1

MOV        PCR14                  ;将寄存器R14的值传送到PC,常用于子程序返回

MOV        R1R0LSL3         ;将寄存器R0的值左移3位后传送到R1

 

MVN   R0,#0          ;将立即数0取反传送到寄存器R0中,完成后R0=-1

CMP R1R0  ;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位

CMP R1,#100     ;将寄存器R1的值与立即数100相减,并根据结果设置CPSR的标志位

 

CMN R1R0  ;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位

CMN R1,#100    ;将寄存器R1的值与立即数100相加,并根据结果设置CPSR的标志位

 

TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。操作数1是要测试的数据,而操作数2是一个位掩码,该指令一般用来检测是否设置了特定的位。

TST  R1,#%1      ;用于测试在寄存器R1中是否设置了最低位(%表示二进制数)

TST  R1,#0xffe   ;将寄存器R1值与立即数0xffe按位与,并根据结果设置CPSR的标志位

 

TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值。该指令通常用于比较操作数1和操作数2是否相等。

TEQ R1R2   ;将寄存器R1值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位

 

ADD        R0R1R2                  R0 = R1 + R2

ADD        R0R1#16             R0 = R1 + 16

ADD        R0R2R3LSL#1        R0 = R2 + (R3 << 1)

 

以下指令序列完成两个128位数的加法,第一个数由高到低存放在寄存器R7R4,第二个数由高到低存放在寄存器R11R8,运算结果由高到低存放在寄存器R3R0

ADDS R0R4R8               加低端的字

ADCS R1R5R9                加第二个字,带进位

ADCS R2R6R10                加第三个字,带进位

ADC R3R7R11             加第四个字,带进位

 

SUB         R0R1R2            R0 = R1 - R2

SUB         R0R1#16        R0 = R1 - 16

SUB         R0R2R3LSL#1         R0 = R2 - (R3 << 1)

SUBS       R8,R6,#240               R8=R6-240,影响CPSR

SUBS   PC,LR,#0X4                   PC=LR-4,CPSR=SPSR

 

SBC指令用于把操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。该指令使用进位标志来表示借位,这样就可以做大于32位的减法。

SBC         R0R1R2R0 = R1 - R2 - C,并根据结果设置CPSR的进位标志位

 

RSB         R0R1R2            R0 = R2 – R1

RSB         R0R1#16        R0 = 16 – R1

RSB         R0R2R3LSL#1   R0 = (R3 << 1) - R2

 

RSC指令用于把操作数2减去操作数1,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。

RSC         R0R1R2                R0 = R2 – R1 - C

 

该指令常用于屏蔽操作数1的某些位逻辑与运算

AND  R0R0,#3                       该指令保持R001位,其余位清零。

 

该指令常用于设置操作数1的某些位逻辑或运算

ORR   R0R0,#3            该指令设置R001位,其余位保持不变。

 

EOR指令用于在两个操作数上进行逻辑异或运算。

EOR R0R0,#3           该指令反转R001位,其余位保持不变。

 

BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。操作数232位的掩码,如果在掩码中设置了某一位,则清除这一位。未设置的掩码位保持不变。

BIC          R0R0,#%1011       该指令清除 R0 中的位 013,其余的位保持不变。

 

MUL          R0R1R2                R0 = R1× R2

MULS  R0R1R2                        R0 = R1 × R2,同时设置CPSR中的相关条件标志位

 

MLA R0R1R2R3                 R0=R1×R2+R3

MLAS R0R1R2R3                 R0=R1×R2+R3,同时设置CPSR中的相关条件标志位

 

SMULL  R0R1R2R3    R0=R2× R3)的低32位,R1 =R2 × R3)的高32

SMLAL R0R1R2R3R0=R2 ×R3)的低32位+R0R1=R2×R3)的高32位+R1

 

UMULL R0R1R2R3      R0 =R2 × R3)的低32R1 =R2 × R3)的高32

UMLAL R0R1R2R3      R0=R2 ×R3)低32位+R0R1=R2 ×R3)的高32位+R1

 

LDR         R0[R1]                   ;将存储器地址为R1的字数据读入寄存器R0

LDR         R0[R1R2]                ;将存储器地址为R1+R2的字数据读入寄存器R0

LDR         R0[R1,#8]              ;将存储器地址为R1+8的字数据读入寄存器R0

LDR     R0[R1R2]         ;将存储器地址为R1+R2的字数据读入寄存器R0,并将新

    ;地址R1R2写入R1

LDR     R0[R1]R2                  ;将存储器地址为R1的字数据读入寄存器R0,并将新地址

    R1R2写入R1

LDR         R0[R1R2LSL2]! ;将存储器地址为R1R2×4的字数据读入

                                         ;寄存器R0,并将新地址R1R2×4写入R1

LDR         R0[R1]R2LSL2  ;将存储器地址为R1的字数据读入寄存器R0

                                        ;并将新地址R1R2×4写入R1

 

LDRB R0[R1]                          ;将存储器地址为R1的字节数据读入寄存器R0, ;并将R0的高24位清零。

LDRB  R0[R1,#8]        ;将存储器地址为R18的字节数据读入寄存器R0

                                       ;并将R0的高24位清零。

 

LDRH R0[R1]                        ;将存储器地址为R1的半字数据读入寄存器R0

                                        ;并将R0的高16位清零。

LDRH R0[R1,#8]              ;将存储器地址为R18的半字数据读入寄存器R0

                                       ;并将R0的高16位清零。

LDRH R0[R1R2]                ;将存储器地址为R1R2的半字数据读入寄存器R0

                                        ;并将R0的高16位清零。

 

STR R0[R1],#8                 ;将R0中的字数据写入以R1为地址的存储器中,并将新                                       ;地址R18写入R1

STR R0[R1,#8]                 ;将R0中的字数据写入以R18为地址的存储器中。

 

STRB     R0[R1]                 ;将R0中的低8位字节数据写入以R1为地址的存储器中。

STRB        R0[R1,#8]       ;将R0中的低8位字节数据写入以R18为地址的存储器中。

 

STRH  R0[R1]                        ;将寄存器R0中的半字数据写入以R1为地址的存储器中。

STRH  R0[R1,#8]           ;将寄存器R0中的半字数据写入以R18为地址的存储器中。

 

{}为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变;

基址寄存器不允许为R15,寄存器列表可以为R0R15的任意组合;

{}为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。

STMFD R13!{R0R4-R12LR}               ;将寄存器列表中的寄存器

                                            ;(R0R4R12LR)存入堆栈。

LDMFD R13!{R0R4-R12PC}              ;将堆栈内容恢复到寄存器

                                           ;(R0R4R12PC)。

LDMFD  R13!{R0R4-R12PC}        ;将堆栈内容寄存                            R0R4R12PC同时SPSR复制到CPSR

 

SWP R0R1[R2]    R0<-[R2],R1->[R2]

SWP R0R0[R1]     R0ßà[R1]    

SWPB R0R1[R2]    ;将R2所指向的存储器中的字节数据传送到R0R0的高24位清零,

                                       ;同时将R1中的低8位数据传送到R2所指向的存储单元。

SWPB R0R0[R1]       ;该指令完成将R1所指向的存储器中的字节数据与R0中的                                       8数据交换。 

 

MRS R0CPSR                 ;传送CPSR的内容到R0

MRS R0SPSR                  ;传送SPSR的内容到R0

0 0