嵌入式开发笔记(五) ARM汇编指令集基础1
1.指令与伪指令的概念:
(1)(汇编)指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器 码,可以由CPU读取执行。
(2)(汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环 境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。
1.1ARM指令的不同风格
两种不同风格的ARM指令
(1)ARM官方的ARM汇编风格:指令一般用大写、Windows中IDE开发环境(如 ADS.MDK等)常用。如: LDR R0, [R1]
(2)GNU风格的ARM汇编:指令一般用小写字母、linux中常用。如:ldr r0, [r1]
2.ARM汇编特点
2.1:LDR/STR架构
ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理。
(1)ldr(load register)指令将内存内容加载入通用寄存器。
(2)str(store register)指令将寄存器内容存入内存空间中。
(3)ldr/str组合用来实现 ARM CPU和内存数据交换
2.2:8种寻址方式
-------------------------------------------------------------------------------
(1)寄存器寻址 mov r1, r2
(2)立即寻址 mov r0, #0xFF00
(3)寄存器移位寻址 mov r0, r1, lsl #3(左移)
---------------------------------------------------------------------------------
(4)寄存器间接寻址 ldr r1, [r2](r2寄存器存放内存的地址所 对应的值)
(5)基址变址寻址 ldr r1, [r2, #4](r2寄存器存放内存的地 址+4)
(6)多寄存器寻址 ldmia r1!, {r2-r7, r12}(r1寄存器存放的 内存地址作为首地 址依次存放到后面 寄存器)
(7)堆栈寻址 stmfd sp!, {r2-r7, lr}(sp堆栈指针连续访 问放到寄存器)
-----------------------------------------------------------------------
(8)相对寻址 beq flag (思想类似于GOTO)
flag:(标号)
2.3:指令后缀
同一指令经常附带不同后缀,变成不同的指令。经常使用的后缀有:
(1)B(byte)功能不变,操作长度变为8位
(2)H(half word)功能不变,长度变为16位
(3)S(signed)功能不变,操作数变为有符号
如 ldr(加载) ldrb (加载bytel) drh ldrsb ldrsh
(4)S(S标志)功能不变,影响CPSR标志位
如 mov和movs movs r0, #0
影响Z。
2.4:条件执行后缀
GT greater than
LT less than
例如:
mov r0, r1 @ 相当于C语言中的r0 = r1;
moveq r0, r1 @ 如果eq后缀成立,则直接执行mov r0, r1;如果eq不成立则 本句代码直接作废,相当于没有
@ 类似于C语言中 if (eq){r0 = r1;}
条件后缀执行注意2点:
1、条件后缀是否成立,不是取决于本句代码,而是取决于这句代码之前的代码运行后的结果。
2、条件后缀决定了本句代码是否被执行,而不会影响上一句和下一句代码是否被执行。
2.5:多级指令流水线
(1)为增加处理器指令流的速度,ARM使用多级流水线.,下图为3级流水线工作原理示意图。(S5PV210使用13级流水线,ARM11为8级)
允许多个操作同时处理,而非顺序执行。
(2)PC指向正被取指的指令,而非正在执行的指令
转载于:https://my.oschina.net/vvbest/blog/811521