汇编指令的学习1——ARM汇编的特点
以下内容源于朱友鹏《物联网大讲堂》的课程学习,如有侵权,请告知删除。
1、指令和伪指令
- 指令是CPU机器指令的助记符,经过编译(汇编器加工)后会得到一串10组成的机器码,可以由CPU读取执行。
- 伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。
2、两种不同风格的ARM指令
- ARM官方的ARM汇编风格:指令一般用大写、Windows中IDE开发环境(如ADS、MDK等)常用。如: LDR R0, [R1]
- GNU风格的ARM汇编:指令一般用小写字母、linux中常用。如:ldr r0, [r1]
(1)ARM汇编特点1:LDR/STR架构
- ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理。
- ldr(load register)指令将内存内容加载入通用寄存器。
- str(store register)指令将寄存器内容存入内存空间中。
- ldr/str组合用来实现 ARM CPU和内存数据交换。
- 如ldr r0,[r1] 和 str r0,[r1],注意前者是向左,后者是向右。
- 寄存器寻址 mov r1, r2 @把r2中的内容赋给r1
- 立即(数)寻址 mov r0, #0xFF00 @#后面直接加数字,#表示后面的是数字
- 寄存器移位寻址 mov r0, r1, lsl #3 @把r1左移3位后,赋给r0
- 寄存器间接寻址 ldr r1, [r2] @r2存的内容是一个地址,[r2]表示该地址的内容。即r2相当指针,[r2]相当指针解引用。
- 基址变址寻址 ldr r1, [r2, #4] @r2存的内容是一个地址,该地址加上4,才是真正的地址
- 多寄存器寻址 ldmia r1!, {r2-r7, r12} @r1相当于数组名,将以其为开始的内容,分别存入后面的寄存器中。
- 堆栈寻址 stmfd sp!, {r2-r7, lr} @类似于上述。
- 相对寻址 beq flag @flag表示标号,表示一个入口点。用pc和相对偏移量,故叫相对寻址。
- B(byte)功能不变,操作长度变为8位
- H(half word)功能不变,长度变为16位
- S(signed)功能不变,操作数变为有符号,如ldr ldrb ldrh ldrsb ldrsh(一般都用ldr,操作长度是4字节)
- S(S标志)功能不变,影响CPSR标志位,如mov和movs,movs r0, #[email protected]这指令会影响标志位(只要最后运算结果为0,那么z就会为1)
- 如下面例子:
- 条件后缀是否成立,取决于该句代码的前一句代码的运行结果。(如果标志z=1,那么该句代码执行(相对这个例子来说))
- 条件后缀决定了本句代码是否执行,而不会影响上一句代码。
- 下面常用的是EQ,NE,如beq就是b和eq的组合。
(5)ARM汇编特点5:多级指令流水线