指令的一般格式:
操作码 操作数 … 操作数
操作数字段可以有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,指向下一个数据的物理地址)。