Arm汇编简单介绍
控制指令
- 跳转指令:
B(Branch)=> 分支的意思B无条件跳转BL带链接的无条件跳转BX带状态切换的无条件跳转 根据目标地址最低位切换状态(arm/thumb)BLX带链接和状态切换的无条件跳转B loc_地址BEQ,BNE
存储器与寄存器交互数据指令 核心
- 存储器/寄存器: 内存,存储数据(小数据:寄存器,大数据:栈)
- 内存: 都是为数据服务
LDR/STRLDR: 从存储器中加载数据到寄存器中 => LOADLDR R8,[R9,#4],R8为待加载数据的寄存器,加载值为R9+0x4所指向的存储单元, 伪代码R8 = *(R9+4)
LDR: 将寄存器的火速据存储到存储区 => StoreSTR R8,[R9,#4],将R8寄存器的数据存储到R9+0x4指向的存储单元,伪代码:*(R9+4) = R8
LDM/STMLDM: 将存储器的数据加载到一个寄存器列表LDM R0,{R1,R3},将R1指向的存储单元的数据一次加载到 R1,R2,R3寄存器
STM: 将一个寄存器列表的数据存储到指定的存储器
PUSH/POPPUSH: 将寄存器的值压入堆栈 压栈==>POP将堆栈值弹出到寄存器 出栈<==
SWP: 将寄存器与存储器之间的数据进行交换SWP R1,R1 [R0],将R1寄存器与R0指向的存储单元的内容进行交换
- 堆,队列:
- 数据结构:
- 栈是竖的,后进先出,且只能从栈顶一次填入数据
- 数据结构:
数据传输指令
MOV 将立即数或寄存器的数据传送到目标寄存器MOV R0,#8 => R0 = 8
数据算数运算指令
ADD,SUB,MUL,DIV
有符号,无符号运算,带进位运算
数据逻辑运算指令
- 与:
AND - 或:
ORR - 异或:
EOR - 移位: 实质是乘/除,类似与小数点移位,但相反.小数点左移变小,右移变大.但逻辑移位,左移变大,右移变小.且按2的倍数进行
LSL:逻辑左移LSR: 逻辑右移LSL R0,R1,#2=>R0 = R1*4LSR R0,R1,#2=>R0 = R1*2
比较指令
CMP: 比较
CMP R0 #0, => R0寄存器中的值与0比较
标志位: 如z位,这个都可以在动态调式时,寄存器窗口看到
其他指令
- 协处理指令:
SWT(切换用户模式) - 伪指令:
DCB
寄存器寻址方式:
- 立即寻址:
MOV R0,#1234=> R0 = 0x1234 - 寄存器寻址:
MOV R0,R1=> R0=R1 - 寄存器移位寻址:
MOV R0,R1,LSL #2=> R0=R1*4 - 寄存器间接寻址:
LDR R0,[R1]=> 将R1寄存器中的值作为地址,去除地址中的值赋予R0 - 寄存器间接基质偏移寻址:
LDR R0,[R1,#-4]=> 将R1寄存器的值-0x4的值作为地址,取出地址中的值给R0
对int a =0这句话简单高级语言的汇编理解,首先会开辟一个内存存储单元,然后把0x0这个数放入R0寄存器,然后再把0x0这个数放入R0寄存器,然后再把R0寄存器的数据放入内存存储单元,
ARM汇编:
| |