一.汇编语言的基本语法
/************************汇编指令的基本结构*****************************/
标号
操作码 操作数1,操作数2,...... ;代码注释
/***********************代码行结束****************************************/
在ARM处理器汇编指令中,标号是可选项。在汇编语言中标号是让汇编器计算程序转移的地址。如果程序中有标号,则标号必须顶格写。
1.立即数操作
一般而言,立即数必须以"#"开头,而第一个操作数将作为当前指令执行结果的存储空间。
/*****************ARM汇编指令的立即数操作*************************/
MOV R0 , #0x10 ;将立即数0x10送入寄存器R0
MOV R1 , #'A' ;将字符A作为立即数送入寄存器R1
/****************代码行结束******************************************/
2.常量
用户可以在汇编指令中通过使用"EQU"来定义常量。
/************* ARM汇编指令EQU操作 ***********************/
;定义常量NVIC_IRQ_SETNO=0xE000E100
NVIC_IRQ_SETNO EQU 0xE000E100 ;代码必须顶格写
LDR R0, = NVIC_IRQ_SETNO ;在一个立即数前面加"=",表示将一地址写入寄存器R0中
MOV R1, #NVIC_IRQ_SETNO ;将立即数传送到R1寄存器
STR R1, [R0] ;*R0=R1
/****************** 代码行结束 ******************************/
由于ARM采用的是RISC结构,数据从内存到CPU之间的移动只能通过LDR/STR指令来完成。注意它们与MOV的区别。
LDR指令是和x86系列处理器所采用的CISC架构芯片区别最大的地方.在x86系列处理器中并有LDR这种指令,因为x86中的MOV指令可以讲数据从内存移动到寄存器中。
3.DCI使用
在某些条件下,ARM编译器可能会出现不认识某些特殊指令助记符的情况。这种情况下,需要用户查出指令所对应的二进制机器码,然后使用DCI指令对该指令进行编译。
例如:通过查询,BKPT可用于软中断,主要用于汇编代码的调试,器机器码是0xBE00.如果编译器在编译的过程中无法识别BPKT指令,则可以使用下面的语句代替
/********************实现手动编译ARM汇编指令******************************/
DCI 0xBE00
/*******************代码行结束****************************************/
4.DCB,DCD的使用
DCB指令用来定义遗传字节常数,字节常熟可以使用字符串的形式来定义。DCD指令用来定义一串32为的整数。通常这两条指令被使用在汇编代码中书协表格.
/*********************ARM汇编指令DCB/DCD********************************/
LDR R3, =MY_NUMBER
LDR R4, [R3]
LDR R0, =HELLO_TEXT
BL PrintText ;跳转到PrintText,打印寄存器R0中的字符
MY_NUMBER ;定义标号MY_NUMBER
DCD 0x11223344
HELLO_TEXT
DCB "Hello\n"
/*********************代码行结束**************************************/
5.汇编指令中的后缀
指令后缀 |
操作说明 |
运算操作符-S |
执行操作运算符后,同时根据运算的结果更新寄存器APSR中的标志位,例如: ADDS R0, R1;将R0与R1中的数值相加,并更新寄存器APSR中的标志位 |
EQ,NE,LT,GT等 |
条件判断执行语句。 EQ=Equal,NE = Not Equal LT=Less Than GT = Great Than |