基础知识
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 | b funa |
(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’就是个全局函数