ARMv7指令集
一条指令中使用操作数字段来描述指令功能。不同的功能需要由不同的操作数来描述,结合寻址方式构成一条完整的指令。一款微处理器所能运行的所有汇编指令合集简称为指令集。
ARM汇编指令分类:跳转指令、数据处理指令、程序状态寄存器访问指令、load/store指令(存储器访问指令)、异常产生指令和协处理器指令。
==========================================
from:ARM architecture reference manual ARMv7-A ARMv7-R
Chaper A4: The instruction sets
This chapter describes the ARM and Thumb instruction sets. It
contains the following sections:
• About the instruction sets on page A4-160
• Unified Assembler Language on page A4-162
• Branch instructions on page A4-164
• Data-processing instructions on page A4-165
• Status register access instructions on page A4-174
• Load/store instructions on page A4-175
• Load/store multiple instructions on page A4-177
• Miscellaneous instructions on page A4-178
• Exception-generating and exception-handling instructions on page A4-179
• Coprocessor instructions on page A4-180
• Advanced SIMD and Floating-point load/store instructions on page A4-181
• Advanced SIMD and Floating-point register transfer instructions on page A4-183
• Advanced SIMD data-processing instructions on page A4-184
• Floating-point data-processing instructions on page A4-191.
==========================================
1 跳转指令
指令格式:B{L}{<cond>} <target_address>
指令功能:相对跳转指令,跳转范围为当前位置±32MB范围内。
B:跳转指令助记符;BL:存储跳转返回地址,可实现函数调用。
范例
B label ;无条件转移到标号为label的指令处
BEQ label ;有条件(Z=1)转移到标号为label的指令处
MOV PC, #0 ;跳转到0x0000_0000地址处
BL func ;调用func子程序
func: ;定义函数名
… ;定义函数体
MOV PC, LR ;R15=R14,恢复断点,实现子程序调用返回
LDR PC, =func ;将函数func存放地址加载到程序计数器2 数据处理指令:
ADC R5,R1, R3 ;R4 = R0+R2+C
ADD R2, R10, R10, LSR #1 ;R2 = R10+R0*2
ANDS R3, R0, #0x7000000 ;R3= R0 & 0x7000000, 影响CPSR寄存器
BIC R0, R0, #0x00002000 ;R0= R0 & !(#0x00002000), R0[13]=0
CMP R5, R4 ;比较 R5, R4
BEQ board_init_in_ram ;若R5=R4,则跳转到board_init_in_ram
ORR R0, R0, #(1<<1);R0 = R0|(1<<1), R0[1]=1
SUB R0, R0,#1 ;R0=R0-1
MUL R4, R2, R1 ;乘 R4 = R2 * R1
MLA R7, R8, R9, R3 ;乘加 R7 = R8 * R9 + R3
UMULL R6, R8, R0, R1 ;无符号乘 R8, R6 = R0 x R1
UMLAL R5, R8, R0, R1 ;无符号乘加长R8, R5 = R0 x R1 + R8, R53 存储器访问指令
助记符LDR实现读存储单元内容,助记符STRB实现存储单元写操作。
LDR R1, [R0] ;读 R1 = [R0]
LDR R8, [R3, #4] ;读 R8 = [R3+4]
LDR R11, [R1, R2] ;读 R11 = [R1 + R2]
STR R2, [R1, #0x100] ;写 [R1+0x100] = R2
STMFD R13!, {R0 - R12, LR} ;R13=SP,将R0~R12,LR入栈。
LDMFD R13!, {R0 - R12, PC} ;数据出栈,存入R0~R12,PC。
LDMIA R0, {R5 - R8} ;连续读取数据到存入R5-R8。
STMDA R1!, {R2 - R11} ;将R2-R11的数据保存到存储器中。
4、程序状态寄存器访问指令
助记符MRS实现读CPSR内容到通用寄存器。
助记符MSR实现将通用寄存器内容写入CPSR。
指令范例
(1)清标志位
MRS R0, CPSR ;读 R0=CPSR
BIC R0, R0, #0xF0000000 ;清N、Z、C、V
MSR CPSR_f, R0 ;写 CPSR标志域, N、Z、C、V、Q =0
(2)禁止IRQ中断
MRS R0, CPSR ;读 R0=CPSR
ORR R0, R0, #0x80 ;I=1
MSR CPSR_c, R0 ;回写CPSR控制域
(3)设置FIQ模式
MRS R0, CPSR ;读 CPSR
BIC R0, R0, #0x1F ;清mode对应位
ORR R0, R0, #0x11 ;置FIQ工作模式位
MSR CPSR_c, R0 ;回写CPSR控制域
5、存储器块访问指令
指令格式
LDM{<cond>}<addressing_mode> Rn{!}, <registers>{^} ;连续读
STM{<cond>}<addressing_mode> Rn{!}, <registers>{^} ;连续写
指令范例
STMFD R13!, {R0 - R12, LR} ;R13=SP,将R0~R12,LR入栈。满递减堆栈。
LDMFD R13!, {R0 - R12, PC} ;数据出栈,存入R0~R12,PC。
LDMIA R0, {R5 - R8} ;连续读取数据到存入R5-R8。
STMDA R1!, {R2 - R11} ;将R2-R11的数据保存到存储器中。
6、寄存器和存储器交换指令
指令范例
SWP R12, R10, [R9] ;R12 =[R9] ,[R9] = R10
SWPB R3, R4, [R8] ;交换字节
7、异常产生指令
指令范例
BKPT ;断点
from:http://infocenter.arm.com/help/basic/help.jsp?topic=/com.arm.doc.dui0204ic/Cihbiggi.html
4.10.1. BKPT断点。
其中:
在 ARM 状态和 Thumb 状态中,ARM 硬件都会忽略
|
SWI ;软件中断
8、协处理器指令
协处理器(coprocessor),一种芯片,用于减轻系统微处理器的特定处理任务。
指令助记符
CDP:协处理器数据操作指令。
LDC:协处理器数据读取指令。
STC:协处理器数据写入指令。
MCR:ARM寄存器到协处理器寄存器的数据传送指令。
MRC:协处理器寄存器到ARM 寄存器到的数据传送指令。
举例:
CDP{cond} coproc, opcodel, CRd, CRn, CRm{,opcode2}
在上述指令格式中:
coproc 指令操作的协处理器名。标准名为pn,n 为0~15。
opcodel 协处理器的特定操作码。
CRd 作为目标寄存器的协处理器寄存器。
CRN 存放第1个操作数的协处理器寄存器。
CRm 存放第2个操作数的协处理器寄存器。
Opcode2 可选的协处理器特定操作码。