ARM汇编语言常用知识

1. 汇编基本知识

在汇编语言中包含有两种指令,分别为:

  • 指令:经过汇编器编译后,在执行阶段起作用,由CPU执行;
  • 伪指令:在编译阶段起作用,用于指导汇编如何进行,不生成机器码。

在编写汇编语言时,指令不区分大小写,即mov与MOV意义相同,代码风格保持一致即可。一般在Windows中常采用大写,在GNU中采用小写。

在汇编语言中,段落的注释采用

/** 注释 **/

单句的注释采用符号@,例如:

mov r1,r2 @注释

2. 常用指令

2.1 条件指令

CMP: 比较
EQ: 相等
NE: 不相等

2.2 数据传送指令

mov:将一个寄存器的值赋给另一个寄存器,或者将一个常数赋值给寄存器。例如:

mov r1,r2 @ r1=r2
mov r1,#128 @r1=128

需要注意的是,mov指令传送的常数必须是立即数。

如果不能判断传送的数是否为立即数,可以使用ldr大范围地址读取伪指令来进行赋值:

ldr r1,=4095

利用该指令有一个缺点是效率。

2.3 内存访问指令

ldr:从内存中读取数据到寄存器(load register)

ldr r1, [r2, #4]	/*将地址为r2+4的内存单元数据读取到r1中*/
ldr r1, [r2]	/*将地址为r2的内存单元数据读取到r1中*/
ldr r1,[r2],#4	/*将地址为r2的内存单元数据读取到r1中,然后r2=r2+4*/
注意:ldr可以是大范围地址读取伪指令,也可以是内存访问指令。当第二个参数有“=”时,为大范围地址读取伪指令。

str:将寄存器的值存储到内存中(store register)

str r1, [r2,#4]	/*将r1的数据保存到地址为r2+4的内存单元中*/
str r1,[r2]	/*将r1的数据保存到地址为r2的内存单元中*/
str r1,[r2],#4	/*将r1的数据保存到地址为r2的内存单元中,然后r2=r2+4*/

2.4 加减指令

add:加指令

sub:减指令

add r1, r2, #1	@r1=r2+1
sub r1, r2, #1	@r1=r2-1

2.5 比较指令

cmp 操作数1, 操作数2

用于比较两个操作数,进行操作数1-操作数2,根据计算结果对标志寄存器进行设置。其主要是设置CPSR(程序状态寄存器)的Z位(Zero result from ALU)。当操作数1=操作数2时,Z位置1,当操作数1 != 操作数2时,Z位置0。
配合bne和beq可以实现跳转:

bne a1	@当操作数1 != 操作数2(即Z位为0时),跳转到a1
beq a2	@当操作数1 == 操作数2(即Z位为1时),跳转到a2

3. 常用伪指令

.extern:定义一个外部符号

.text:表示下面的语句属于代码段

.global:将本文件中的某个程序标号定义为全局的

注:未完成,不断更新。。。

你可能感兴趣的:(嵌入式)