汇编程序前要加PRESERVE8
require8和preserve8c和汇编有8位对齐的要求,这两个伪指令能够满意此要求
LDR和MOV
LDR Rn, label1
LDR指令负责将label1所代表的存储器中数据搬移到内部寄存器Rn中。指令使用方式有:
LDR R0,[R1] ;
R1中代表存储器地址,在存储器中将R1地址处的数据加载到寄存器R0中。
LDR R0,=0x00000040 ;
将立即数装入R0中,如果立即数小,该指令等效 MOV R0,#64,如果立即数很大比如占据32bit,那么该指令将变成伪指令,见下条。
LDR R0,=0xF0000000 ;
立即数很大,无法将立即数和指令合并成32bit,指令会被编译器拆分为LDR R0, [PC, #offset]; .word 0xF00000000两条指令,即先将立即数利用.word指令存储在该LDR指令附近,编译器计算立即数与当前正在执行指令PC(program counter)指针的偏差offset,注意ARM是流水线指令,采用取指令,译指令和执行指令。
LDR R0,label;
将label标号所代表的寄存器地址中数据装在到R0。
STR
STR{条件} 源寄存器,<存储器地址>
STR指令用亍从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常
用,丏寻址方式灵活多样,使用方式可参考指令LDR。
指令示例:
STR R0,[R1],#8 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。
STR R0,[R1,#8] ;将R0中的字数据写入以R1+8为地址的存储器中。”
MSR
MRS R0,CPSR ; 读取CPSR
BIC R0,R0,#0x1F ; 修改,去除当前处理器模式
ORR R0,R0,#0x13 ; 修改,设置特权模式
MSR CPSR_c, R0 ; 写回,仅仅修改CPSR中的控制位域
ldmia与stmdb
ldmia r0!, {r4-r11, r14} 的意思是
LDMIA 中的 I 是 increase 的缩写,A 是 after 的缩写,LD加载(load)的意思
R0后面的感叹号“!表示会自动调节 R0里面的指针
所以整句话意思是任务栈R0的存储地址由低到高,将R0存储地址里面的内容手动加载到 CPU 寄存器 R0,R4-R12里
还有一种是STMDB R1!, {R0,R4-R12} 这就和上面反过来了,ST是存储(store)的意思,D是decrease的意思,B是before的意思,整句话就是R1的存储地址由高到低递减,将R0,R4-R12里的内容存储到R1任务栈里面。
stmdb:db(decrease before)表示先减后存。
指令 stmdb sp!, { fp, ip, lr, pc} %% "!”表示sp等于最终被修改的sp的值。
假设 sp=4096,此条指令的执行过程如下:
1.先减:sp=sp-4=4092;
2.后存:4092-4095处存放pc的值;
3.先减:sp=sp-4=4088;
4.后存:4088-4091处存放lr寄存器的值;
以此类推,..........。
ldmia:ia(increase after)表示先读后增。
指令ldmia sp, {fp,sp, pc}
假设 sp=4080,此条指令的执行过程如下:
1.先读:fp位于4080-4083处存放原来保存的fp;
2.后增:sp=sp+4=4084;
3.先读:sp位于4084-4087处存放原来保存的ip;
4.后增:sp=sp+4;
cps
指令名 | 功能描述 |
DMB | 数据存储器隔离。DMB 指令保证: 仅当所有在它前面的存储器访问操作 都执行完毕后,才提交(commit)在它后面的存储器访问操作。 |
DSB | 数据同步隔离。比 DMB 严格: 仅当所有在它前面的存储器访问操作 都执行完毕后,才执行在它后面的指令(亦即任何指令都要等待存储器访 问操作——译者注) |
ISB | 指令同步隔离。最严格:它会清洗流水线,以保证所有它前面的指令都执 行完毕之后,才执行它后面的指令。 |
svc
nop
空操作
ORR
ORR指令的格式为: ORR{条件}{S} 目的寄存器,操作数1,操作数2
ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。
操作数1应是一 个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。
操作数2为32位的掩码,如果在掩码中置了某一位1,则将这一位置1。未设置的掩码位保持不变。
B BL BX BLX
(1) B 跳转指令
(2) BL 带返回的跳转指令
(3) BLX 带返回和状态切换的跳转指令
(4) BX 带状态切换的跳转指令
X 指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM 指令,也可以是Thumb指令。因此可以将处理器的工作状态有ARM 状态切换到Thumb 状态