ARM学习笔记(一)

一、常量定义及赋值与寄存器赋值:

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为大范围的读取,常用来加载立即数或一个地址值到指定寄存器。

你可能感兴趣的:(ADR,ARM,stm,LDM,程序的空间属性)