5-汇编指令总结

基础知识

1. 伪指令

1.1 指令概念

​ 指令是指指令系统的各条指令,每一条指令在源程序汇编时都要产生可供计算机执行的指令代码(即目标代码),每一条指令语句是表示计算机具有的一个基本能力。

1.2 伪指令概念

​ 伪指令是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有机器代码,只用于汇编过程中为汇编程序提供汇编信息。例如,提供如下信息:哪些是指令、哪些是数据及数据的字长、程序的起始地址和结束地址等。伪指令有2个特点:

(1)由于是伪“指令”,因而它只存在于汇编语言中。高级语言中不叫指令,叫语句;

(2)由于是“伪”指令,也即“假”指令,因而不是可执行指令,不会产生机器代码,不会占用ROM空间,只用于汇编过程中为汇编程序提供汇编信息。

1.3 常用指令总结

​ 在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初始化,进出中断时的环境保护,恢复等对性能有要求的地方。

​ ARM指令集可分为六大类,分别是数据处理指令、Load/Store指令、跳转指令、程序状态寄存器处理指令、协处理器指令和异常产生指令。

​ ARM的寻址方式可分为立即寻址、寄存器寻址、寄存器间接寻址、基址加偏址寻址、堆栈寻址、块拷贝寻址、相对寻址。

1.3.1 相对跳转指令:B、BL

(1)B与BL指令的作用是什么?

​ B与BL指令的作用: 实现程序跳转,也就是调用子程序。

(2)B与BL指令的区别是什么?

​ B指令: 简单的程序跳转,跳转到目标号处执行。

​ BL指令:带链接程序跳转,也就是要带返回地址。在发生跳转前,将当前PC-4保存到R14中。

​ 也就是将返回地址存在R14中,所以可以在子程序返回时只要MOV PC,LR即可

(3)B{条件} <地址>

​ B—Branch

1
2
3
4
5
6
7
b funa
....
funa:
b funb
....
funb:
....

(4)BL{条件}<地址>

​ BL—Branch withLink

(5)BX{条件}<地址>

​ BX—Branch and eXchange_Instructions(计算机中一般不用E,例如执行权限EXE,用X代表)

​ BX用法:

​ BX Rn

​ BX是跳转指令,Rn是寄存器,如果Rn的位0为1,则进入Thumb状态;如果Rn的位为0,这进入ARM状态。(原因:ARM指令的后两位始终为0,而Thumb指令的后一位始终为0,因此采用位0来表示ARM指令与Thumb指令的切换标志位。)

​ 1、ARM状态:32位,ARM状态执行字对齐的32位ARM指令。

​ 2、Thumb状态,16位,执行半字对齐的16位指令。

​ 3、用BX Rn指令来进行两种状态的切换:

​ 注:1、ARM和Thumb两种状态之间的切换不影响处理器的工作模式和寄存器的内容。

​ 2、ARM处理器在处理异常时,不管处理器处于什么状态,则都将切换到ARM状态。

1.3.2 数据传送指令mov,地址读取伪指令ldr

​ mov指令可以把一个寄存器的值赋给另外一个寄存器,或者把一个常数赋给寄存器。

​ mov r1, r2

​ mov r1, #1024

​ mov传送的常数必须能用立即数表示。当不能用立即数表示时,可以用ldr命令来赋值。Tips:ldr时伪命令,不是真实存在的指令,编译器会把他扩展成真正的指令;如果该常数能用“立即数”来表示,则使用mov指令,否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。

1.3.3 内存访问指令ldr、str、ldm、stm

1.3.4 加减指令

​ add r1, r2, #1

​ sub r1, r2, #1

1.3.5 程序状态寄存器的访问指令msr,mrs

1.3.6 异常中断指令

1.3.7 其他伪指令

​ (1).extern main

​ ‘.extern’定义一个外部符号(可以是变量也可以是函数),上面的代码表示文本文件中引用的main是一个外部函数。

​ (2).text

​ ‘.text’表示下面的语句都属于代码段

​ (3).global _start

​ _start:

​ ‘.global’将本文件中的某个程序标号定义为全局的,如’_start’就是个全局函数