指令的一般格式:

操作码    操作数  …  操作数  

操作数字段可以有2个或者3个,第一个操作数为:目的操作数;后面的均为:源操作数。

什么是寻址方式?

寻址方式:指根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。

ARM处理器具有:立即寻址、寄存器寻址、寄存器移位寻址、寄存器间接寻址、基址寻址、多寄存器寻址,共6中寻址方式。

立即寻址:

立即寻址方式用来表示常数,常用于给寄存器赋初值,且只能用于源操作数段,不能用于目的操作数字段。操作数存放在指令中,它作为指令的一部分存放在代码段中,这种操作数称:立即数。立即数以#为前缀。

Eg:    SUB  R0,R0,#1           ;将R0减1,结果放入R0

        MOV  R0,#0xFF             ;  将立即数0xFF放入R0寄存器

寄存器寻址:

寄存器寻址:操作数的值存放在寄存器中,指令的地址码指出寄存器的编号,执行时需取出该值。寄存器范围R0~R14。由于操作数在寄存器中,不需访问存储器,故速度快。

Eg:    执行前:【R1】=0x0000FFFF,【R2】=0x12345678。

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

寄存器移位寻址:

该寻址方式为ARM指令集特有的寻址方式,只能对第二个操作数使用。

1种左移操作(LSL:逻辑左移),4种右移操作(LSR:逻辑右移、ASR:算术右移,符号不变、ROR:循环右移、RRX:扩展循环右移)

Eg:    MOV    R0,R1,LSL #3        ;R1的值左移3位,结果放入R0,即R0=R1X8。

寄存器间接寻址:

指令中的地址码给出一个通用寄存器的编号,所需的操作数保存在通用寄存器指定的存储单元中,即寄存器为操作数的地址指针。

Eg:    LDR     R1,【R2】         ;将R2指向的存储单元的数据读出,保存至R1

       ADD    R1,R2,【R3】  ;将R3指向的存储单元的数据与R2相加,存至R1

基址寻址:

将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。用于访问基址附近的存储单元,常用于查表、数组操作等。

Eg: 1 、 LDR    R2,【R3,#0x0C】  ;将【R3+0x0C】àR2,基址是R3,偏移量为#0x0C

     2、 LDR    R2,【R3,#0x0C】!  ; 将【R3+0x0C】àR2,基址是R3=R3+0x0C

     3、 LDR    R2,【R3】,#0x0C    ;【R3】->R2 ,基址R3=R3+0x0C

        1:前索引基址寻址,基址寄存器值不变;

        2:前索引基址寻址,基址寄存器值改变;

        3:后索引基址寻址。

多寄存器寻址:

即:一次对多个寄存器寻址。一条指令最多可寻16个寄存器(R0~R14、CPSR或SPSR)。

常用于堆栈和块拷贝。

Eg:  LDMIA   R1!,【R2-R7,R12】  ;将R1指向的单元中的数据读出到R2-R7,R12中(每读出一个数据,R1自动加4,指向下一个数据的物理地址)。