ARM汇编(构建中)
2017-12-27 21:00:59 19 举报
AI智能生成
学习ARM汇编,如果收藏,记得点赞
作者其他创作
大纲/内容
ARM汇编
流水线
3级
基本指令=取指+译码+执行
5级
ARM9(V4)开始
基本指令=取指+译码+访存+写回+执行
编程模型
ARM核工作状态
ARM模式
32位指令
Thumb
16位指令
寄存器概念
特殊功能寄存器
外设的
ARM寄存器37个寄存器
仅在ARM核内部
通用寄存器31个
r0~r15在不同工作模式下,有额外的同名寄存器例如大多数工作模式下,有独立的r13和r14而所有工作模式都共用一份r0~r7寄存器即在不同工作模式下,同名寄存器代号可能对应的是不同的寄存器硬件
r15=pc
指向要取指令的地址
1个
所有模式共用
r14=lr
返回地址
6个
FIQ/IRQ/SVC/Undef/Abort/其他模式,各一份,共6份
r13=sp
栈指针
r8~r12
通用
各2个,共10个
FIQ/其他模式,各一份,共2份
r0~r7
各1个,共8个
状态寄存器6
CPSR(Current Program Status Register)1个,所有工作模式共用
SPSR(Saved Program Status Register)5个给不同的工作模式
FIQ/IRQ/SVC/Undef/Abort各1个
f区标志域屏蔽字节[31:24]
NZCVadd后加s会影响cmp指令
[28]
V
1:overflow
[29]
C
1:进位/借位
[30]
Z
1:结果=0
[31]
N
1:结果为负或小于
s区状态域屏蔽字节[23:16]
Undefined
x区扩展域屏蔽字节[15:8]
c区控制域屏蔽字节[7:0]
[4:0]
7种工作模式
User
0b10000
用户模式
System
0b11111
系统模式
FIQ
0b10001
外设发送快速中断
IRQ
0b10010
外设发送低优先级中断
Abort
0b10111
CPU取指或访存失败
Undef
0b11011
CPU不识别指令
SVC
0b10011
svc管理模式
复位或软中断指令(SWI)
[5]
T
1:Thumb
[6]
F
1:禁止FIQ
[7]
I
1:禁止IRQ
数据类型
Byte
1
Half
2
Word
4
DoubleWord
8
汇编语法
文件名
*.s/*.S
行注释
@
代码示例
指令
释义
{可选内容}
opcode
operation code操作码
cond
condition条件码
S
根据运算结果更新CPSR中的NZCV
Rd
目标寄存器
Rn
存放第一操作数的寄存器
operand2
第2操作数
const
数字,例如#12
shift_operand
移位操作
〈opcode〉{〈cond〉} {S} 〈Rd〉,〈Rn〉{,〈operand2〉}
数据处理指令一般格式
分支指令
B
相对跳转前后32M
BL
带返回的,CPU自动保存下一条指令的地址到LR
BX
跳转同时切换ARM/Thumb状态
举例
BEQ label
相等时跳转
跳转条件Z=1
BNE label
不相等时跳转
跳转条件Z=0
数据处理指令
数据传送
MOV
MVN
取反传送,先取反
立即数范围0~0xFF
算术运算
ADD
ADC
额外+C
SUB
SBC
额外-C
RSB
RSC
位运算
AND
ORR
EOR
异或
BIC
位清除
~&
比较
CMP
根据op0-op1改变cpsr
CMN
根据op0+op1改变cpsr
TST
根据op0&op1改变cpsr
TEQ
根据op0^op1改变cpsr
寄存器加载/存储指令
LDR
加载字
加载无符号字节
加载无符号半字
加载有符号字节
加载有符号半字
STR
存储字
存储字节
存储半字
addressing
[r1]
r1作为地址
r1-0x8作为地址
r1-r2作为地址
r2+r1*4作为地址
r1+0x8作为地址,然后r1=r1+0x8
r1作为地址,然后R1=R1+0x20
栈操作指令
基本栈种类
减栈
地址减小
加栈
地址增加
满栈
栈顶保存有效元素
空栈
栈顶未保存有效元素
组合栈种类
FD
满减栈
适用Linux
ED
空减栈
FA
满加栈
EA
空加栈
满减栈操作指令
STMFD
push
LDMFD
pop
r4~r7和lr保存到栈,并令sp指向栈顶
栈中取数据给r4~r7和pc,并令spz指向栈顶
小标号寄存器会压栈到低地址
状态寄存器访问指令
伪指令
ADR
+-1020字节
ADRL
加载长地址
+-256K
取expr的值
取expr地址(4K)的内容
NOP
空操作
CPU不能直接识别,需要汇编器翻译
伪操作GNU ARM
常量定义伪操作
.equ
#define
.global/.globl
声明全局
.exterm
extern
.byte
分配字节内存空间,并赋值
.word value
.hword/.short
.ascii/.asciz/.string
字符串,其中ascii需要补\\0
.space/.skip
.arm/.code 32/.thumb/.code 16
.section
.text/.data/.bss
条件码助记符
NE
Z=0
EQ
Z=1
CS/HS
C=1
无符号数大于等于
CC/LO
C=0
无符号数小于
MI
N=1
负数
PL
N=0
正数或零
VS
V=1
溢出
VC
V=0
HI
unsigned>
LS
unsigned <=
GE
N=V
signed >=
LT
N!=V
signed <
GT
signed>
LE
signed<=
AL
无条件
NV
从不执行
移位操作符
LSL
左移
LSR
右移
ASR
算术右移,高位不变
ROR
循环右移
RRX
算术循环右移,高位补C
影响CPSR
指令后+S,并目标寄存器是PC
cpsr=spsr
指令后+S
影响NZCV
ARM跳转方式
发生异常
直接向PC赋值
异常7种
复位异常
svc
PC=0
系统复位
未定义指令
PC=0x4
执行未定义指令
软中断
PC=0x8
swi指令
预取指令
0x0C
取指失败
数据异常
0x10
访存失败
0x18
外设发送IRQ
0x1C
外设发送FIQ
处理异常
ARM核先保存CPSR到SPSR
设置CPSR
存储返回地址
LR=PC-4
设置PC=异常入口
预先配置异常向量表
软件处理
从LR恢复PC从SPSR恢复CPSR
未定义指令异常
FIQ/IRQ
预取指令异常
数据处理异常
编译
as -g -o *.o *.s
模拟
qemu-arm -g 1234 *
gdb *
info reg查看寄存器值
target remote local:1234
ARM C/C++和汇编混合编程
函数传参
默认用r0~r3
其他参数放入栈
访问多的参数放前4个
asmlingage
强制使用栈传参
返回值默认用r0
C调用汇编
汇编
.global func.global var
extern func(void);extern int var;
汇编调C
全局函数才可以被调用
.extern func.extern var
协处理器
可以修改异常向量表起始地址
0 条评论
回复 删除
下一页