前言
感觉自己好菜,天天混日子,要抓紧时间学习了!
参考文章:
https://blog.csdn.net/qq_48922607/article/details/129767546
基本介绍
基础语法
在ARM汇编中,所有标号都必须在一行的顶格书写,后面不能添加”:”,而且所有指令均不能顶格书写。ARM汇编器对标识符大小写敏感,书写标号以及指令时需要字母大小写一致,在ARM汇编程序中,一个ARM指令、伪指令、寄存器名可以全部为大写字母,也可以全部为小写字母,但不要大小写混合使用。注释使用”;”,注释内容由”;”开始到此行结束,注释可以在一行的顶格写。
格式:【标号】 <指令|条件|S> <操作数> [;注释]
源程序中允许有空行,适当地插入空行可以提高源代码的可读性。如果单行太长,可以使用字符“\” 将其分行 ,”\”后不能有任何字符,包括空格和制表符。对于变量的设置,常量的定义,其标识符必须在一行的顶格书写。
标号
在ARM汇编中,标号代表一个地址,段内标号的地址在汇编时确定,而段外标号的地址值在连接时确定。
符号
在ARM汇编中,符号可以代表地址、变量、数字常量。当符号代表地址时又称为标号,符号就是变量的变量名、数字常量的名称、标号,符号的命名规则如下:
- 1、符号由大小写字母、数字以及下划线组成;
- 2、除局部标号以数字开头外,其它的符号不能以数字开头:
- 3、符号区分大小写,且所有字符都是有意义的:
- 4、符号在其作用域范围你必须是唯一的;
- 5、符号不能与系统内部或系统预定义的符号同名;
- 6、符号不要与指令助记符、伪指令同名。
段定义
ARM汇编程序设计采用分段式设计,一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段及数据段.
ARM 汇编程序经过汇编处理后生成一个可执行的映象文件,该文件通常包含下面3部分内容:
一个或多代码段,代码段通常是只读的,
零个或多个包含初始化值的数据段.这些数据段通常是可读写的,零个或多个不包含初始值的数据段,这些数据被初始化为0,通常中可读写的连接器根据一定的规则将各个段安排到内存中的相应位置,源程序中段之间的相邻关系与执行的映象文件中段之间的相邻关系并不一定相同.
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
汇编点灯代码示例
SCU_BASE_ADDRESS EQU 0x40010800 ;//系统寄存器
SCU_IPCKENR2_OFFSET EQU 0x20 ;//模块时钟使能
SCU_PASTR_OFFSET EQU 0x78 ;//模块时钟使能
SCU_PA_BADS_OFFSET EQU 0x88 ;//模数选择寄存器GPIO_BASE_ADDRESS EQU 0x4001F000 ;GPIOAB外设基地址
GPIO_DIR_OFFSET EQU 0x00 ;方向寄存器设置
GPIO_SET_OFFSET EQU 0x08 ;电平置为设置
GPIO_CLR_OFFSET EQU 0x0C ;电平清零设置AREA ARMex, CODE, READONLy ENTRYEXPORT mainmain PROCLDR R0,=(SCU_BASE_ADDRESS + SCU_IPCKENR2_OFFSET)LDR R1, [R0]
; ORRS R1, R1, #(1<<1)MOVS R1,#0x00000071STR R1, [R0]
; MOVS R1,#0x00000022LDR R0,=(SCU_BASE_ADDRESS + SCU_PA_BADS_OFFSET)LDR R1, [R0]LDR R1,=0xFFFF9EFDSTR R1, [R0]LDR R0,=(GPIO_BASE_ADDRESS + GPIO_DIR_OFFSET)LDR R1, [R0]MOVS R1,#0x00000002STR R1, [R0]Loop ; 3、设置GPIOB5的输出寄存器LDR R2, =(GPIO_BASE_ADDRESS + GPIO_SET_OFFSET)LDR R1, [R2]MOVS R1,#0x00000002STR R1, [R2]LDR R0, =100000BL delay; 6、设置GPIOB5输出低LDR R2, =(GPIO_BASE_ADDRESS + GPIO_CLR_OFFSET)LDR R1, [R2]MOVS R1,#0x00000002STR R1, [R2]LDR R0, =100000BL delayB LoopENDP ;过程的结束delay PROCSUBS R0, R0, #1BNE delayBX LRALIGN ;填充字节使地址对齐END ;整个汇编文件结束