arm架构初探
一直没有涉足过arm呢,走一波
精简指令集
ARM架构是一个32位精简指令集(RISC)处理器架构 ,广泛地使用在许多嵌入式系统设计。具有节能的特点,ARM处理器非常适用于移动通讯领域。相比于x86,ARM往往没有较好的CPU,所以性能相较没有优势;而其流水线指令集的效率会较为优秀,在一些任务相对固定的应用场合其优势就能发挥得淋漓尽致。
寄存器
r0-r3又称为临时工作寄存器,表示可以用来传递参数和返回值,但是不够的话就会用到栈来传递;也称为 a1-a4;callee不需要保存。
r4-r9寄存器可以在函数内部表示局部变量,但如果用到变量的地址,也会类似x86在栈中分配一块;也称为 v1-v6;
r10:sl是栈限制寄存器,当sp递减时不能低于它的值;
r11:fp是栈帧寄存器,和x86的ebp作用类似,用来访问局部变量和参数,而且还保存之前sp的值;
r12:ip,当进入函数时mov ip, sp
r13是sp寄存器;
r14是 lr 返回地址寄存器;
r15是pc (类似EIP) 寄存器。
参数传递
一般采用B系列指令执行函数的跳转执行,其中BL指令将返回地址存储于LR寄存器,BLX指令除了地址存储于LR寄存器,还对要执行的指令进行判断(ARM or Thumb)。
在参数传递时,将所有参数看作是存放在连续的内存单元中的字数据。然后,依次将各字数据传送到寄存器R0~R3中,如果参数多于4个,则通过栈进行存储,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。
局部变量可以存储在寄存器中,也可以有栈来分配。
函数执行完后,若结果32位的整数时,可以通过寄存器返回(一般使用R0)。 64位整数时,可以通过寄存器R0和R1返回,依次类推(不含浮点运算结果)。最后将之前保存的函数地址赋予到PC(可以是LR,也可以是其他寄存器)。
系统调用
在ARM架构上,所有的系统调用都是通过SWI软中断来实现的,指令如下: SWI{cond} immed_24,具体的调用号存放在寄存器R7中,调用函数的参数和之前提到的传参方式相同。例如:
exit(0)
MOV R0,#0
MOV R7,#7
SWI #0