一、常量定义及赋值与寄存器赋值:
1. 常量定义及赋值:
在程序的最前面,赋值采用.equ,如.equ x, 45,即定义一个常量x=45。在代码中使用x的方式与立即数相同,需要加#。
2. 寄存器赋值:
常采用MOV指令。
二、全局变量定义:
.global _start 常作为程序入口
三、程序的空间属性:
一般情况下,一个程序本质上都是有BSS段、DATA段和代码(text/code)段。
1. BSS段:用来存放程序中未初始化的全局变量的一块内存区域、静态内存分配:
.bss全局变量数据段,存放未初始化的全局变量和静态变量,可读可写,程序会为这些段初值清零。
2. DATA段:用来存放程序中已初始化的全局变量的一块内存区域、静态内存分配:
.data数据段,存放初始化了的全局变量和静态变量,可读可写。
3. 代码段:用来存放程序执行代码的一块内存,常为只读:
.text
四、程序结束:
stop:
b stop
相当于一个死循环。
.end标志程序真正结束
五、LDM和STM:
实现在一组寄存器和一块连续的内存单元之间传输数据,允许一条指令传送16 个寄存器的任何子集或所有寄存器,格式如下:
LDM{cond}<模式> Rn{!}, reglist{^}
STM{cond}<模式> Rn{!}, reglist{^}
其中,Rn为基址寄存器,在LDM中为指向待传送数据的起始位置,在STM为指向待存储的数据区域的起始位置。
!表示最后地址是否写回Rn;reglist中多个寄存器用“,”隔开,对于连续的寄存器标号可用-连接首位即可。
^后缀不允许在用户呈系统模式下使用,若在LDM指令的寄存器列表中包含了PC,那么除了正常的多寄存器数据传送外,将SPSR拷贝到CPSR,可用于异常处理返回。
主要用途:现场保护、数据复制、参数传递。
八种模式:IA, IB, DA, DB, FA, FD, EA, ED,前4中常用于数据操作,而后4中常用与堆栈操作。
六、ADR指令:小范围的地址读取(伪指令)
ADR指令将基于PC相对偏移的地址值读取到寄存器中。在编译源程序时,ADR被编译器替换成一条合适的指令(通常为ADD或SUB)。若不能用一条指令实现,则产生错误,编译失败。
ADR{cond} register, exper
register为加载的目标寄存器;exper为地址表达式,当值为非字对齐时,取值范围-255~255字节之间,当值为字对齐时,取值范围为-1020~1020字节之间。
举例:
LOOP MOV R1, #0XF0
...
ADR R2, LOOP
ADR R3, LOOP+4
BX R0 ;带状态切换的跳转
也可用来加载地址实现查表:
...
ADR R0, DISP_TAB
LDRB R1, [R0, R2] ;使用R2作为索引查表
DISP_TAB
DCB 0XC0, 0XF9, 0XA4......
类似的,ADRL为中等范围的读取,LDR为大范围的读取,常用来加载立即数或一个地址值到指定寄存器。