最近在学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 <Label> ; 仅当EQ满足时转移 |
统一汇编语言(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位指令变得很容易。
了。