ARM汇编(构建中)
2017-12-27 21:00:59 20 举报
AI智能生成
学习ARM汇编,如果收藏,记得点赞
作者其他创作
大纲/内容
流水线
3级
基本指令=取指+译码+执行
5级
ARM9(V4)开始
基本指令=取指+译码+访存+写回+执行
编程模型
ARM核工作状态
ARM模式
32位指令
Thumb
16位指令
寄存器概念
特殊功能寄存器
外设的
ARM寄存器
37个寄存器
37个寄存器
仅在ARM核内部
通用寄存器
31个
31个
r0~r15
在不同工作模式下,有额外的同名寄存器
例如大多数工作模式下,有独立的r13和r14
而所有工作模式都共用一份r0~r7寄存器
即在不同工作模式下,
同名寄存器代号可能对应的是不同的寄存器硬件
在不同工作模式下,有额外的同名寄存器
例如大多数工作模式下,有独立的r13和r14
而所有工作模式都共用一份r0~r7寄存器
即在不同工作模式下,
同名寄存器代号可能对应的是不同的寄存器硬件
r15=pc
指向要取指令的地址
1个
所有模式共用
r14=lr
返回地址
6个
FIQ/IRQ/SVC/Undef/Abort/其他模式,各一份,共6份
r13=sp
栈指针
6个
FIQ/IRQ/SVC/Undef/Abort/其他模式,各一份,共6份
r8~r12
通用
各2个,共10个
FIQ/其他模式,各一份,共2份
r0~r7
通用
各1个,共8个
所有模式共用
状态寄存器
6
6
CPSR(Current Program Status Register)
1个,所有工作模式共用
1个,所有工作模式共用
SPSR(Saved Program Status Register)
5个给不同的工作模式
5个给不同的工作模式
FIQ/IRQ/SVC/Undef/Abort各1个
f区
标志域屏蔽字节
[31:24]
标志域屏蔽字节
[31:24]
NZCV
add后加s会影响
cmp指令
add后加s会影响
cmp指令
[28]
V
1:overflow
[29]
C
1:进位/借位
[30]
Z
1:结果=0
[31]
N
1:结果为负或小于
s区
状态域屏蔽字节
[23:16]
状态域屏蔽字节
[23:16]
Undefined
x区
扩展域屏蔽字节
[15:8]
扩展域屏蔽字节
[15:8]
Undefined
c区
控制域屏蔽字节
[7:0]
控制域屏蔽字节
[7:0]
[4:0]
7种工作模式
User
0b10000
User
用户模式
System
0b11111
System
系统模式
FIQ
0b10001
FIQ
外设发送快速中断
IRQ
0b10010
IRQ
外设发送低优先级中断
Abort
0b10111
Abort
CPU取指或访存失败
Undef
0b11011
Undef
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
行注释
@
代码示例
.text @代码段起始
.code 32 @32位指令
.global start @全局函数
start:
mov r0, #10 @r0=10
ldr r1, =3 @r1=3
add r0, r0, r1 @r0=r0+r1
b . @死循环,跳转到当前
.end @start结束
.code 32 @32位指令
.global start @全局函数
start:
mov r0, #10 @r0=10
ldr r1, =3 @r1=3
add r0, r0, r1 @r0=r0+r1
b . @死循环,跳转到当前
.end @start结束
指令
释义
{可选内容}
opcode
operation code操作码
cond
condition条件码
S
根据运算结果更新CPSR中的NZCV
Rd
目标寄存器
Rn
存放第一操作数的寄存器
operand2
第2操作数
const
数字,例如#12
shift_operand
移位操作
〈opcode〉{〈cond〉} {S} 〈Rd〉,〈Rn〉{,〈operand2〉}
〈opcode〉{〈cond〉} {S} {〈Rd〉,}〈Rn〉,#<const>
数据处理指令一般格式
<opcode>{<cond>} {S} <Rd>,<Rn>, <shift_operand>
分支指令
B
相对跳转前后32M
BL
带返回的,CPU自动保存下一条指令的地址到LR
相对跳转前后32M
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
LDR{cond} Rd, addressing
加载字
LDR{cond}B Rd, addressing
加载无符号字节
LDR{cond}H Rd, addressing
加载无符号半字
LDR{cond}SB Rd, addressing
加载有符号字节
LDR{cond}SH Rd, addressing
加载有符号半字
STR
STR{cond} Rd, addressing
存储字
STR{cond}B Rd, addressing
存储字节
STR{cond}H Rd, addressing
存储半字
addressing
[r1]
r1作为地址
[r1,#-0x8(12bit)]
r1-0x8作为地址
[r1,-r2]
r1-r2作为地址
[r2,r1,lsl #2]
r2+r1*4作为地址
[r1,#0x8]!
r1+0x8作为地址,然后r1=r1+0x8
[r1],#0x20
r1作为地址,然后R1=R1+0x20
栈操作指令
基本栈种类
减栈
地址减小
加栈
地址增加
满栈
栈顶保存有效元素
空栈
栈顶未保存有效元素
组合栈种类
FD
满减栈
适用Linux
ED
空减栈
FA
满加栈
EA
空加栈
满减栈操作指令
STMFD
push
LDMFD
pop
举例
STMFD sp!,{r4-r7,lr}
r4~r7和lr保存到栈,并令sp指向栈顶
push {r4-r7,lr}
LDMFD sp!,{r4-r7,pc}
栈中取数据给r4~r7和pc,并令spz指向栈顶
pop {r4-r7,pc}
小标号寄存器会压栈到低地址
状态寄存器访问指令
MRS{cond} Rd, SPSR/CPSR_f/s/x/c
MSR{cond} SPSR/CPSR_f/s/x/c, Rm/#8位立即数
伪指令
ADR
ADR{cond} Rd, expr
+-1020字节
ADRL
加载长地址
+-256K
LDR
LDR{cond} Rd,=expr
取expr的值
LDR{cond} Rd,expr
取expr地址(4K)的内容
NOP
空操作
CPU不能直接识别,需要汇编器翻译
伪操作
GNU ARM
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
C=1,Z=0
unsigned>
LS
C=0,Z=1
unsigned <=
GE
N=V
signed >=
LT
N!=V
signed <
GT
Z=0,N=V
signed>
LE
Z=1,N!=V
signed<=
AL
无条件
NV
从不执行
移位操作符
LSL
左移
LSR
右移
ASR
算术右移,高位不变
ROR
循环右移
RRX
算术循环右移,高位补C
影响CPSR
指令后+S,并目标寄存器是PC
cpsr=spsr
指令后+S
影响NZCV
ARM跳转方式
发生异常
分支指令
直接向PC赋值
异常7种
复位异常
svc
PC=0
系统复位
未定义指令
Undef
PC=0x4
执行未定义指令
软中断
svc
PC=0x8
swi指令
预取指令
Abort
0x0C
取指失败
数据异常
Abort
0x10
访存失败
IRQ
0x18
外设发送IRQ
FIQ
0x1C
外设发送FIQ
处理异常
ARM核先保存CPSR到SPSR
设置CPSR
存储返回地址
LR=PC-4
设置PC=异常入口
预先配置异常向量表
处理异常
软件处理
从LR恢复PC
从SPSR恢复CPSR
从SPSR恢复CPSR
软中断
movs pc,lr
未定义指令异常
movs pc,lr
FIQ/IRQ
subs pc,lr,#4
预取指令异常
subs pc,lr,#4
数据处理异常
subs pc,lr,#8
编译
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
.global var
C
extern func(void);
extern int var;
extern int var;
汇编调C
C
全局函数才可以被调用
汇编
.extern func
.extern var
.extern var
协处理器
可以修改异常向量表起始地址
0 条评论
下一页