arm知识简介

这一部分转载至ARM pwn 入门 (1)如有侵权请联系我,我将删去。

1.寄存器

寄存器是汇编语言的核心,在x86-64系统中,最为常见的寄存器有以下这些:

64位:
rax, rbx, rcx, rdx
rsi, rdi, rsp, rbp, rip
r8, r9, r10, r11, r12, r13, r14, r15
32位:
eax, ebx, ecx, edx
esi, edi, esp, ebp, eip
r8d, r9d, r10d, r11d, r12d, r13d, r14d, r15d

在大多数程序中,这17个寄存器是最为常用的寄存器,其中rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp, rip有专门的作用,但其中的rax, rbx, rcx, rdx, rsi, rdi功能相对更加灵活,不像rsp只能用于表示栈顶地址,rbp只能用于表示栈帧地址,rip只能用于表示当前指令地址等。另外的8个寄存器则是通用寄存器,想用来干嘛就干嘛。

那么在ARM架构中,寄存器则是以下这些:

64位:
X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12
X13, X14, X15
32位:
R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12
R13, R14, R15

其中R0~R12为通用寄存器,共13个,剩下的3个有特殊用途:

  • R13为栈指针,又称SP,相当于rsp,在物理上实际上有两个栈指针:主栈指针和进程栈指针,一般的进程只有一个栈指针可见。这个也好理解,就好比在x86-64系统中,内核的栈指针和用户进程的栈指针不同一样。

  • R14为链接寄存器,又称LR,用于保存函数调用时的返回值。在x86-64系统中,函数调用的返回值是保存在子函数栈帧的上面,即rbp+8的位置,在ARM系统中,函数调用同样需要将返回地址保存到栈中,因为LR在函数返回时会进行自动更新,如果栈中没有返回地址,那么LR就不知道要更新成什么值了。当然LR的作用不止这些,在后面遇到具体问题时再进行分析。

  • R15为程序计数器,又称PC,可读可写。读操作返回当前指令地址+4(由ARM指令集特性决定,ARM指令集中任何一条指令都是偶数长度,与x86-64不同),写操作会导致执行流跳转。PC的最低有效位(LSB)是一个控制结构,为1时表示进入Thumb状态。当有些时候程序跳转更新PC时需要将新PC值的LSB置1,否则会触发错误异常。这也可以看做是一种程序恶意跳转的保护机制。有时还会将PC作为基址访问数据。

除了这些寄存器之外,两个架构下都各自有各自的特殊寄存器,如x86-64架构下的rflags控制寄存器用于保存程序执行的状态。在ARM中同样具有类似功能的控制寄存器:

3个中断-异常屏蔽寄存器的功能较少用到,这里先不进行讨论。
CONTROL寄存器确定了栈指针的选择和线程模式的访问等级,其只能够在特权等级下才能进行修改。

名 字

功能描述

PRIMASK

1位宽寄存器。置位后关闭NMI(不可屏蔽中断和HardFault外的所有可屏蔽异常/中断。

FAULTMASK

1位宽寄存器。置位后只有NMI可以响应(相比于PRIMASK,可屏蔽的中断/异常多了HardFault)。

BASEPRI

根据优先级屏蔽中断/异常,该寄存器最多有9位(由设计实现的优先级位数决定)。该寄存器定义了被屏蔽优先级的阈值。当它被设置为某个值后,所有优先级号大于等于此值的中断都被关(注意:优先级号越大,优先级越低);若设置成0,则不关断任何中断。

文章作者: A1b2rt
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 pwn手的成长之旅
喜欢就支持一下吧
打赏
微信 微信