ARM Cortex-M3 学习笔记(4-1)

最近在学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位指令变得很容易。

了。


你可能感兴趣的:(c,汇编,gcc,读书,less,语言)