ARM汇编指令集 指令、伪指令 (汇编)指令: 是机器码的助记符,经过汇编器编译后,由CPU执行。 (汇编)伪指令:用来指导指令执行,是汇编器的产物,最终不会生成机器码。
有两种不同风格的ARM指令 1).ARM官方的ARM汇编风格:指令一般用大写,Windows中的IDE开发环境。 2).GNU风格的ARM汇编:指令一般用小写。
ARM汇编的特点 1. LDR/STR架构 1).ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理。 2. 至此8种寻址方式 1).寄存器寻址mov r1, r2。 5).基址变址寻址ldr r1, [r2, #4]内存地址在r2+4里面。 6).多寄存器寻址 ldmia r1!, {r2-r7, r12}一次访问多个寄存器。 3. 指令后缀 同一指令经常附带不同后缀,变成不同的指令。经常使用的后缀有: 4. 条件执行后缀 条件后缀是否成立取决于当前代码的前面的代码。 条件后缀只影响当前代码的执行。 5. 多级指令流水线 为增加处理器指令流的速度,ARM使用多级流水线.,下图为3级流水线工作原理示意图。(S5PV210使用13级流水线,ARM11为8级) 1).PC指向正被取指的指令,而非正在执行的指令
数据传输与跳转指令详解 1. 数据处理指令 数据传输指令
mov mvn
2. cpsr访问指令 mrs & msr 3. 跳转(分支)指令 b & bl & bx 4. 访存指令 ldr/str &
ldm/stm & swp 5. 软中断指令 swi(software interrupt) ARM汇编中的立即数 合法立即数与非法立即数
协处理器与协处理器指令集 6.协处理器cp15操作指令 mcr & mrc 7.arm寻址方式 1). 寄存器: MOV R1,R2 ; R2->R1
2). 立即数: SUBS R0,R1,#1; R0=R1-1
3). 寄存器移位:MOV R0,R2,LSL #3 ;R2左移三位->R0
4). 间接寻址: LDR R1,[R2] ; 装载R2指向的内存数值至R1
5). 基址寻址: LDR R2,[R3,#0x0F] ;R3+0x0F作为地址,将所
指向的置装入R2.R3的值不改变
6). 多寄存器寻址: LDMIA R1!,{R2-R7,R12} ; 将R1所指向的内
存块依次装入{}中的寄存器。
STMIA R0!,{R3-R6,R10} ;将{}列出的寄存器里的值依次填入R0所指向的内存块。
7). 相对寻址: BL XXX ;跳转
BEQ XXX ;条件跳转
协处理器解析: SoC内部另一处理核心,协助主CPU实现某些功能,被主CPU调用执行一定任务。
MRC & MCR的使用方法 mcr{<cond>} p15, <opcode_1>, <Rd>, <Crn>, <Crm>, {<opcode_2>}
ldm/stm与栈的处理 为什么需要多寄存器访问指令 ldr/str每周期只能访问4字节内存,如果需要批量读取、写入内存时太慢,解决方案是stm/ldm 举例(uboot start.S 537行) stmia
sp, {r0 - r12}
后缀的种类: ia(increase after)先传输,再地址+4
四种栈解析: 空栈:栈指针指向空位,每次存入时可以直接存入然后栈指针移动一格;而取出时需要先移动一格才能取出。
!的作用: ldmia
r0, {r2 - r3}
^的作用: ldmfd
sp!, {r0 - r6, pc}
总结:批量读取或写入内存时要用ldm/stm指令。
常用gun伪指令: global _start
@ 给_start外部链接属性
偶尔会用到的gun伪指令 .end
@标识文件结束 ldr
大范围的地址加载指令 adr与ldr adr编译时会被1条sub或add指令替代,而ldr编译时会被一条mov指令替代或者文字池方式处理;
@笔记记得有点不清晰,希望在学习ARM在座的各位指出哪有错,大家一起进步,共同学习。@ /******************************** Stay hungry, Stay foolish. @Rocky ********************************/
|
|
来自: lifei_szdz > 《知识扩展》