一、指令和伪指令
汇编指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以
由CPU读取执行。
汇编伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供
的,目的是用来指导编译过程,经过编译后伪指令不会生成机器码。
二、两种不同风格的ARM指令
1、ARM官方的ARM汇编风格:指令一般用的小、windows中IDE开发环境如:LDR
R0,[R1]
2、GNU风格的ARM汇编:指令一般用小写字母、linux中常用。如:ldr r0,[r1]
三、ARM汇编的特点
1、LDR/STR架构
(1)、ARM采用RISC架构,CPU本身不能直接读取内存,需要将内存中的值加载
到通用寄存器中才能被CPU处理。
(2)、ldr指令将内存内容加载入通用寄存器。
(3)、str指令将寄存器中的值加载到内存空间中。
(4)、ldr/str组合用来实现ARM CPU和内存数据交换。
2、ARM汇编特点:多级流水线
-
3、8中寻址方式
寄存器寻址 mov r1,r2
立即寻址 mov r0,#0xFF00
寄存器移位寻址 mov r0,r1,lsl#3
寄存器间接寻址 ldr r1,[r2]
基址变址寻址 ldr r1,[r2,#4]
多寄存器寻址 ldmia r1!,{r2-r7,r12}
堆栈寻址 stmfd sp!,{r2-r7,lr}
相对寻址 beq flag
flag:
四、ARM常用的汇编指令:
数据传输指令:mov mvn
算术指令: add sub rsb adc sbc rsc
逻辑指令: and orr eor bic
比较指令: cmp cmn tst teq
乘法指令: mvl mla umull umlal smull smlal
前导零计数器 :clz
CPSR寄存器比较特殊,需要专门的指令访问:这就是mrs和msr
mrs用来读取CPSR的值,msr用来写CPSR
协处理器cp15操作指令
mrc用来读取cp15中的寄存器,mcr用来写入cp15中的寄存器
^的作用:在目标寄存器有pc时,会同时将spsr写入到cpsr中,一般用于从异常模式返回。
例如 ldmfd sp!,{r0-r6,pc}^
五、伪指令
1、伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。
2、伪指令的意义在于指导编译过程。
3、伪指令是和具体的编译器相关的,我们使用gnu工具链,因此学习gnu环境下的汇编伪指令。
4、@用来做注释。和C语言中的//是相同的。
5、#做注释,一般放在行首,表示这一行都是注释而不是代码
6、:以冒号结尾的是标号
6、.点号在gnu汇编中表示当前指令的地址
7、#立即数,前面要加#或者$
8、 重要的几个伪指令:
ldr 大范围的地址加载指令
adr 小范围的地址加载指令
adrl 中等范围的地址加载指令
nop 空操作
9、adr和ldr
adr编译时会被1条sub或者add指令替代,而ldr编译时会被一条mov指令替代或者文字池处理。
adr总是以pc为基准来表示地址,因此指令本身和运行地址有关,可以用来检测当前运行地址在
哪里。
ldr加载的地址和链接时给定的地址有关,由链接脚本决定。
欢迎各位指出不足之处
2万+

被折叠的 条评论
为什么被折叠?



