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:将本文件中的某个程序标号定义为全局的
注:未完成,不断更新。。。