以下内容源于朱友鹏《物联网大讲堂》的课程学习,如有侵权,请告知删除。
1、指令和伪指令
指令是CPU机器指令的助记符,经过编译(汇编器加工)后会得到一串10组成的机器码,可以由CPU读取执行。伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。2、两种不同风格的ARM指令
ARM官方的ARM汇编风格:指令一般用大写、Windows中IDE开发环境(如ADS、MDK等)常用。如: LDR R0, [R1]GNU风格的ARM汇编:指令一般用小写字母、linux中常用。如:ldr r0, [r1] 3、ARM汇编的特点(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],注意前者是向左,后者是向右。 (2)ARM汇编特点2:8种寻址方式(寄存器之间用mov,内存和寄存器之间用ldr和str) 寄存器寻址 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和相对偏移量,故叫相对寻址。 (3)ARM汇编特点3:指令后缀,同一指令经常附带不同后缀,变成不同的指令。经常使用的后缀有: B(byte)功能不变,操作长度变为8位H(half word)功能不变,长度变为16位S(signed)功能不变,操作数变为有符号,如ldr ldrb ldrh ldrsb ldrsh(一般都用ldr,操作长度是4字节)S(S标志)功能不变,影响CPSR标志位,如mov和movs,movs r0, #0@这指令会影响标志位(只要最后运算结果为0,那么z就会为1) (4)ARM汇编特点4:条件执行后缀 如下面例子:条件后缀是否成立,取决于该句代码的前一句代码的运行结果。(如果标志z=1,那么该句代码执行(相对这个例子来说))条件后缀决定了本句代码是否执行,而不会影响上一句代码。下面常用的是EQ,NE,如beq就是b和eq的组合。
(5)ARM汇编特点5:多级指令流水线