最近在学ARM Cortex-M3,找了本声称很经典的书“An Definitive Guide to The ARM Cortex-M3”在看。这个系列学习笔记其实就是在学习这本书的过程中做的读书笔记。
第四章 指令系统
根本语法
这儿介绍的汇编语法是ARM汇编器的语法,假如选用其他的汇编器,比方gcc中的as,语法是不同的。
汇编指令的典型形式如下所示:
Label
opcode operand1, operand2, … ;comment
标号是可选的,假如有,它有必要顶格写,标号后边不需要“:”。
操作码是指令的助记符,它的前面有必要有至少一个空白符。
当即数有必要以“#”最初,16进制数字一共与C言语的办法相同,比方:
MOV R0, #0x12 ; R0 0x12
运用EQU指示字来界说常数:
NVIC_IRQ_SETEN0 EQU 0xE000E100 ; 留意:常数界说有必要顶格写
NVIC_IRQ0_ENABLE EQU 0x1
…
LDR R0, =NVIC_IRQ_SETEN0 ;在这儿的LDR是个伪指令,它会被汇编器转换成
;一条“相对PC的加载指令”
MOV R1, #NVIC_IRQ0_ENABLE ; 把当即数传送到R1中
DCI 能够在汇编代码中刺进1 个half word (2个字节),通常用这条指令刺进汇编器不支持的指令。
DCB来界说一串字节常数
DCD来界说一串32位整数
比方下面的比如:
LDR R3, =MY_NUMBER ; R3= MY_NUMBER
LDR R4, [R3] ; R4= *R3
…
LDR R0, =HELLO_TEXT ; R0= HELLO_TEXT
BL PrintText ; 呼叫PrintText以显现字符串,R0传递参数
…
MY_NUMBER
DCD 0x12345678
HELLO_TEXT
DCB ”Hello\n”,0
指令后缀
后缀 |
意义 |
S |
要求更新APSR中的相关标志,例如: ADDS R0, R1 ; 依据加法的成果更新APSR中的标志 |
EQ,NE,LT,GT等 |
有条件地碑文指令。 EQ=Euqal, NE= Not Equal, LT= Less Than, GT= Greater Than,例如: BEQ |
一致汇编言语(UAL)
与Thumb-2指令集一起呈现的还有新的汇编语法(一致汇编言语)。运用一致汇编言语的语法,咱们能够便利的挑选当时的查办是被编译为16位的指令仍是编译为32位的指令。
ADD R0, R1 ; 运用传统的Thumb语法
ADD R0, R0, R1 ; 引进UAL后答应的等效写法(R0=R0+R1)
假如运用传统的Thumb语法,有些指令会默许地更新APSR。
假如运用UAL语法,则有必要指定S后缀才会更新。例如:
AND R0, R1 ;传统的Thumb语法
ANDS R0, R0, R1 ;等值的UAL语法(有必要有S后缀)
.W(Wide)后缀指定32位指令,.N后缀拟定选用16位指令。假如没有给出后缀,汇编器会先试着用16位指令以给代码减肥,假如不可再运用32位指令。例如:
ADDS R0, #1 ;汇编器将为了节约空间而运用16位指令
ADDS.N R0, #1 ;指定运用16位指令(N=Narrow)
ADDS.W R0, #1 ;指定运用32位指令(W=Wide)
32位的Thumb-2指令能够half word 对齐。不必word对齐使得代码中混用16位指令和32位指令变得很简单。
了。