美文网首页
ARM汇编笔记

ARM汇编笔记

作者: zhd______ | 来源:发表于2021-04-20 21:30 被阅读0次

arm指令占用4字节
thumb指令占用2字节

1. 寻址方式

注释符号@
@ 单行注释
立即寻址(立即数寻址)

操作数本身就在指令中,这个操作数就叫立即数。所以这种指令对应的寻址方式就叫立即寻址。

mov r0, #0x10           @ r0 = 16
mov r1, #2              @ r1 = 2
add r0, r0, #2          @ r0 = r0 + 2
寄存器寻址

利用寄存器中的数值作为操作数。(这种寻址方式执行效率较高)

mov r0, r1          @ r0=r1
add r0, r1, r2      @ r0 = r1 + r2
寄存器移位寻址

LSL 逻辑左移
LSR 逻辑右移
ROR 循环右移
ASR 算术右移
RRX 扩展的循环右移

mov r0, r1, LSL #4  @ r0 = r1 << 4
mov r0, r0, LSR #4  @ r0 = r0 >> 4
寄存器间接寻址

以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中
[ ] 表示取值符

add r0 ,r1 ,[r2]   @ r0  = r1+*r2
相对寻址

以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址

b #0x18
bl #0x4
多寄存器寻址(stm/ldm)

一条指令可以完成多个寄存器值的传送
这种寻址方式可以用一条指令传送最多16个通用寄存器的值

ldmia r0 , {r1,r2,r3,r4}   @ r1 = [r0] , r2 = [r0+4] , r3 = [r0+8] ,r4 = [r0+12]
stmia   r0!,{r3-r6,r10};将 r3-R6,r10的值保存到 r0 指向的地址,过程中r0 自动加 1

其中,后缀 ia 表示每次执行完 加载/存储 操作后,r0 按字长度增加

堆栈寻址(stm/ldm)

堆栈是一种数据结构(它其实就是存储器中的一块连续存储单元,配合一个专用寄存器--存放堆栈指针实现的一种工具),它按先进先出的方式工作。
堆栈寻址使用堆栈指针sp,即r13,指向堆栈的栈顶。堆栈可分为两种:
向上生长:向高地址方向生长,称为递增堆栈,
向下生长:向低地址方向生长,称为递减堆栈,
堆栈指针指向最后压入的有效数据项,称为满堆栈,
堆栈指针指向下一个要放入的空位置,称为空堆栈,这样就有 4 种类型的堆栈。
A)满递增:堆栈地址向上增长,堆栈指针指向有效数据的最高地址。如 ldmfa,stmfa。
B)空递增:堆栈地址向上增长,堆栈指针指向堆栈上的第一个空位置。如 ldmea,stmea 。
C)满递减:堆栈地址向下增长,堆栈指针指向有效数据项的最低地址。如 ldmfd,stmfd。
D)空递减:堆栈地址向下增长,堆栈指针指向堆栈下的第一个空位置。如 ldmed,stmed 。

stmfd     sp!,{r1-r7,lr}  @ 将 r1~r7,lr 入栈。满递减堆栈。
ldmfd     sp!,{r1-r7,lr}  @ 数据出栈,放入 r1~r7,lr 寄存器。满递减堆栈。

2. 汇编指令

跳转指令

b 强制跳转指令
bl 带返回的跳转指令, lr
blx 带返回和带状态切换的跳转指令, arm -> thumb, thumb -> arm
bx 带状态切换的跳转指令

Load/Store指令
ldr r0, =0x2              @ r0=0x2
ldr r0, [r3]              @ r0 = *r3
ldr r0, [r3, #4]          @ r0 = *(r3+4)
ldr r0, [r3, #8]              @ r0 = *(r3+8)
ldr r0, [r3, r2, LSL #2]      @ r0 = *(r3 + (r2 << 2))
数据处理指令

mov, add, sub, and, eor, orr, bic(位清除)

mov r0, r1
add r0, r1, r2  @ r0 = r1 + r2
and r0, r1, r2  @ r0 = r1 & r2
eor r0, r1, r2  @ r0 = r1 ^ r2
orr r0, r1, r2  @ r0 = r0 | r2
bic r0, r1, #0xF @0x12345678 -> 0x12345670
乘法指令
mul r0, r1, r2   @ r0 = r1 * r2
mla r0, r1, r2, r3  @ r0 = r1 * r2 + r3
smull r0, r1, r2, r3  @ r0 = (r2 * r3)的低32位,r1 = (r2 * r3)的高32位,
smlal r0, r1, r2, r3  @ r0 = (r2 * r3)的低32位 + r0,r1 = (r2 * r3)的高32位 + r1,
umull r0, r1, r2, r3  @ r0 = (r2 * r3)的低32位,r1 = (r2 * r3)的高32位,
umlal r0, r1, r2, r3  @ r0 = (r2 * r3)的低32位 + r0,r1 = (r2 * r3)的高32位 + r1,
内存访问指令

ldr 4字节读取
ldrb 1字节读取
ldrh 2字节读取

str 4字节写入
strb 1字节写入
strh 2字节写入

文章参考:
https://blog.csdn.net/chance_yin/article/details/9796699
https://www.cnblogs.com/icefree/p/8539112.html

相关文章

网友评论

      本文标题:ARM汇编笔记

      本文链接:https://www.haomeiwen.com/subject/rwbglltx.html