ARM指令集
-
一、ARM指令格式
< opcode > {< cond >} {S} < Rd >,< Rn >,< shift_operand >
<>号内是必须的,{}号内的项是可选的
-
二、合法立即数
-
三、数据传送指令
-
四、数据计算指令
-
五、比较指令
-
六、跳转指令
-
七、位运算
-
AND
-
格式:AND 目标寄存器,操作数1,操作数2
-
功能:按位与,将操作数1与操作数2按位与的结果存放在目标寄存器
-
AND R0,R1,#2 ==>R0 = R1 AND 2 AND R0,R1,R2 ==>R0 = R1 AND R2 AND R0,R1,R2,LSL #3 ==>R0 = R1 AND (R2 << 3) @AND按位与运算:0x12345678,将它的高16位存放在r0中,它的低16位存放在r1中,然后将它的高16位和低16位相加 ldr r2,=0x12345678 ldr r0,=0x0000FFFF AND r1,r2,r0 mov r0,r2,lsr #16 add r0,r0,r1
-
-
ORR
-
EOR
-
BIC(BIC<==>&~)
-
格式:BIC 目标寄存器,操作数1,操作数2
-
功能:位清除
将操作数1按位与操作数2取反的结果存放在目标寄存器(操作数1 &~ 操作数2)
-
@BIC位清除运算:7 BIC 3 = 4 mov r0,#7 @0111 mov r1,#3 @0011 bic r0,r0,r1 @0100--4==>操作数1二进制的位与操作数2二进制相对应为1的位直接置0就是最终结果 BIC r1,r0,#0xa 0xa 0000 1010 ~0xa 1111 0101 0xff 1111 1111 0xff & ~0xa 1111 0101
-
将某一位置1,与1进行或操作,结果一定是1,与0进行或操作 结果保持不变 ,1 | 1 = 1,0 | 1 = 1,0 | 0 = 0 ,1 |0 = 1
-
将某一位清0,与0进行与操作,结果一定是0,与1进行&操作,结果保持不变,1 & 1 = 1,0 & 1 = 0,0 & 0 = 0 ,1 &0 = 0
-
0xabcd将它的[3:1]设置为101,然后将它的[11:7]清0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 0 1 0 [1 0 1 1 1] 1 0 0 [1 1 0] 1 data = 0xabcd data = data & ~(7 << 1) //[3:1]清0 data = data | (0x5 << 1)//[3:1]设置为101 data = data & ~(0x1f << 7)//[11:7]清0 有一个数据32bit的data,将它的[18:9]清0,将它的[10:4]变成1010011,其他位不变 data = data & ~(0x3ff << 9)//[18:9]清0 data = data & ~(0x7f << 4)//[10:4]清0 data = data | (0x53 << 4)//[10:4]设置为1010011
-
-
-
八、内存访问指令
-
单寄存器操作
-
LDR(Load Register)加载
-
STR(Store Register)存储
-
地址寻址模式
-
寄存器间接寻址模式
-
格式:
-
功能:
-
@内存访问指令 @ldr r0,=0x12345678 @mov r1,#0x40000000 @ int *p = (int *)0x40000000 @str r0,[r1] @ *r1 = r0 将r0的值存到0x40000000 *p = 0x12345678 @ldr r2,[r1] @ r2 = *r1 将0x40000000的值存储到r2中 r2 = *p @将0x1234写到0x4000,0000 ,将0xabcd写到0x4000,0004,然后从这两个地址读取数据做累加,最终结果存放在r0 ldr r0,=0x1234 mov r1,#0x40000000 str r0,[r1] @将0x1234写到0x4000,0000 ldr r0,=0xabcd mov r2,#0x40000004 str r0,[r2] @将0xabcd写到0x4000,0004 ldr r0,[r1] ldr r3,[r2] add r0,r0,r3 @累加(0x1234 + 0xabcd = 0xBE01)
-
-
基址寻址模式
-
两种模式都需要将内存地址保存到寄存器中,需要使用 LDR 伪指令用法
ldr r0,=0x40000000
-
@将1-10数据存放在基地址为Ox4000,0000,将0x4000,0000起始地址的值拷贝到0x4000,0100 mov r0,#0x40000000 @基地址 mov r1,#1 @i = 1 mov r2,#10 @num = 10 bl store_data @跳转到store_data,将PC值保存到LR mov r0,#0x40000000 @存储基地址 ldr r1,=0x40000100 @拷贝基地址 bl copy_data @跳转到copy_data,将PC值保存到LR store_data: str r1,[r0],#4 @*r0 = r1,r0 = r0 + 4 add r1,r1,#1 @r1 = r1 + 1 cmp r1,r2 ble store_data @if (r1 <= r2) goto store_data mov pc,lr @回到bl store_data下一条语句 copy_data: ldr r3,[r0],#4 str r3,[r1],#4 @*r1 = r3,r1 = r1 + 4 sub r2,r2,#1 @i = i - 1 cmp r2,#0 bgt copy_data @if (r2 > 0) goto copy_data
-
-
将内存地址保存到寄存器中
-
keil 内存数据仿真
-
-
多寄存器操作
-
LDM
-
STM
-
MODE(地址模式)
-
IA(Increment After)先操作寄存器(值),后增加地址
-
mov r0,#0x10 mov r1,#0x20 mov r2,#0x30 ldr r3,=0x40000100 @IA:先操作寄存器(值),后增加地址 stmia r3,{r0-r2} @寄存器列表,将 r0-r2 的值依次存放到r3对应的内存地址空间(低地址--->高地址) ldmia r3,{r4-r6} @将r3内存地址对应的连续三个值依次加载到r4,r5,r6
-
-
IB(Increment Before)先增加地址,后操作寄存器(值)
-
mov r0,#0x10 mov r1,#0x20 mov r2,#0x30 ldr r3,=0x40000100 @IB:先增加地址,后操作寄存器(值) stmib r3,{r0-r2} @寄存器列表,将 r0-r2 的值依次存放到r3对应的内存地址空间(低地址--->高地址) ldmib r3,{r4-r6} @将r3内存地址对应的连续三个值依次加载到r4,r5,r6
-
-
DA(Decrement After)先操作寄存器,后减少地址
-
mov r0,#0x10 mov r1,#0x20 mov r2,#0x30 ldr r7,=0x4000010C @DA:先操作寄存器(值),后减小地址 stmda r7,{r0-r2} @寄存器列表,将 r0-r2 的值依次存放到r7对应的内存地址空间(低地址--->高地址) ldmda r7,{r4-r6} @将r7内存地址对应的连续三个值依次加载到r4,r5,r6
-
-
DB(Decrement Before)先减少地址,后操作寄存器
-
mov r0,#0x10 mov r1,#0x20 mov r2,#0x30 ldr r7,=0x4000010C @DB:先减小地址,后操作寄存器(值) stmdb r7,{r0-r2} @寄存器列表,将 r0-r2 的值依次存放到r7对应的内存地址空间(低地址--->高地址) ldmdb r7,{r4-r6} @将r7内存地址对应的连续三个值依次加载到r4,r5,r6
-
-
在操作地址时,必须遵循大地址对应大寄存器编号,小地址对应小寄存器编号
-
-
-
@在0x40000000地址依次将r1=10,r2=20,r3=30,r5=50存入,然后r1到r5清零,在从内存读到r1到r5,得到原始数值 mov r0,#0x40000000 mov r1,#10 mov r2,#20 mov r3,#30 mov r5,#50 stmia r0!,{r1-r3,r5} @寄存器数据写入内存,更新基址寄存器的地址 @清空寄存器值 mov r1,#0 mov r2,#0 mov r3,#0 mov r5,#0 @读出内存数据到寄存器 ldmdb r0!,{r1-r3,r5}
-
-
-
九、SPSR/CPSR操作指令
-
读操作
-
写操作
-
@将CPSR的第7位(I)清0,其他位不变(效果:使能IRQ(一般中断模式)异常) mrs r0,cpsr @将cpsr的值读到一个通用寄存器 mov r1,#1 @先将1写入r1 bic r0,r0,r1,lsl #7 @再将r1逻辑左移7位赋值给r0 msr cpsr,r0 @再将r0写入cpsr @将CPSR的第7位(I)置1,其他位不变(效果:禁用IRQ异常) mrs r0,cpsr @将cpsr的值读到一个通用寄存器 mov r1,#1 @先将1写入r1 orr r0,r0,r1,lsl #7 @再将r1逻辑左移7位赋值给r0 msr cpsr,r0 @再将r0写入cpsr
CPSR第I位默认为1
不能对CPSR直接使用BIC运算,需要借助其他寄存器
-
-
-
十、栈操作指令(操作R13)
-
十一、指令流水线
-
十二、伪指令