一.汇编的前世今生
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
汇编是上世纪五十年代人们为了摆脱机器语言的繁琐而创造的,因此,比起机器语言,汇编语言具有更高的机器相关性,更加便于记忆和书写,但又同时保留了机器语言高速度和高效率的特点。但汇编语言仍是面向机器的语言,很难从其代码上理解程序设计意图,设计出来的程序不易被移植。
故而为了增加程序的效率与可移植性,在同时代,又诞生了第一个高级语言——Fortran。在高级语言下的今天,我们为何还要学习汇编呢?不仅是因为汇编独有的效率与速度,而且能帮助我们更好的理解底层,进行深入学习。
了解汇编语言会使人意识到:
程序如何与OS,处理器和BIOS交互;
内存和其他外部设备中数据的表示方式;
处理器如何访问和执行指令;
指令如何访问和处理数据;
程序如何访问外部设备。
使用汇编语言的其他优点是:
它需要更少的内存和执行时间;
它可以更轻松地实现特定于硬件的复杂作业。
适用于时间紧迫的工作;
它最适合编写中断服务程序和其他内存驻留程序。
二.寄存器
我们对ARM的所有指令操作基本上都是建立在寄存器上的,所以在学习ARM汇编指令前我们必须先了解ARM内部的寄存器。
ARM 总共有 37 个寄存器,分为七个模式,但是每种模式下最多只能看到 18 个寄存器。(其中有些寄存器虽然同名,但在某种特定模式才会发挥特定作用,只有切换到对应模式时才能看到,这种设计叫做影子寄存器(banked register))。
37个寄存器都是 32 位长度。
37 个寄存器中 30 个为“通用”型,1 个固定用作 PC,一个固定用作 CPSR,5 个固定用作 5 种异常模式下的 SPSR。
上述的 30 个为“通用”型,是指这 30 个寄存器区别于后面的寄存器:PC 寄存器固定只能是 r15 寄存器,不能将其他寄存器作为 PC 寄存器使用; CPSR 和 SPSR 寄存器也是固定的,不能将其他寄存器作为 PC 寄存器使用。
七种模式:
(1)USR(10000):正常用户模式,程序正常执行模式。
(2)FIQ(10001):快速中断模式,以处理快速情况,支持高速数据传输或通道处理。
(3)IRQ(10010):外部中断模式,普通中断处理
(4)SVC(10011):操作系统保护模式(管理模式),即操作系统使用的特权模式(内核),处理软件中断swi reset
(5)abt(10111):数据访问中止模式,用于 虚拟存储器 和 存储器 保护
(6)und(11011):未定义指令终止模式,用于支持通过软件仿真硬件的协处理器
(7)sys(11111):系统模式,用于运行特权级的操作系统任务( armv4 以上版本才具有)
功能:
R0-R3 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。
被调用函数在返回之前不必恢复 r0-r3。如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。
R4-R11 被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。
R12 是内部调用暂时寄存器 ip。它在过程链接胶合代码(例如,交互操作胶合代码)中用于此角色。
在过程调用之间,可以将它用于任何用途。被调用函数在返回之前不必恢复 r12。
R13 是栈指针 sp。它不能用于任何其它用途。sp 中存放的值在退出被调用函数时必须与进入时的值相同。
R14 是链接寄存器 lr。如果您保存了返回地址,则可以在调用之间将 r14 用于其它用途,程序返回时要恢复
R15 是程序计数器 PC。它不能用于任何其它用途。
注意:在中断程序中,所有的寄存器都必须保护,编译器会自动保护R4~R11