环境配置
sudo apt install libncurses5-dev gcc-arm-linux-gnueabi build-essential synaptic gcc-aarch64-linux-gnu |
寄存器
与先前学过的inter指令集不同的是 arm采用的是精简指令集 虽然可以更快的执行指令 但是由于指令较少 因此在实现功能的时候会比inter更加繁琐
x86架构中 可以直接对内存数据进行操作 但是在arm架构中 只能通过寄存器来中转 先将内存中的数据存入寄存器再操作 这一点类似8086
arm架构下 又可以细分为armel和armhf 这是在32位下 至于64位 则都是采用armhf
二者的区别在于浮点运算上 他们在浮点运算时都会使用fpu寄存器 但是前者在传参的时候会使用普通寄存器 而后者在传参时则会使用fpu寄存器 所以armhf的浮点运算能力更强
ARM一共有37个寄存器 其中31个32位的通用寄存器 以及6个32位的状态寄存器
ARM处理器一共有7种模式
用户模式(usr):ARM处理器正常的程序执行状态。非特权模式。
快速中断模式(fiq):用于高速数据传输或通道处理。
外部中断模式(irq):用于通用的中断处理。
管理模式(svc):操作系统使用的保护模式。
数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。
系统模式(sys):运行具有特权的操作系统任务。
定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。
任意处理器模式下 可使用的寄存器包含15个通用寄存器 即R0-R14还有程序计数器PC以及一两个状态寄存器
R0寄存器可以用于存储临时值 也用于存储函数调用后的返回值
R0~R3寄存器就负责存储调用函数的参数
R7寄存器用于存储系统调用号 (这一点倒是比x86做的好 x86的rax寄存器又是存储函数返回值又是存储系统调用号的 可以通过read函数来控制rax寄存器的值 然后就可以自定义系统调用号
R11寄存器用来存储回溯信息 也可以作为局部变量 (这里的回溯信息有点疑惑是具体指什么 如果是用来返回父函数的 又和LR寄存器冲突 希望下面的研究能够了解一下
R13寄存器就是堆栈指针 指向堆栈的顶部
R14寄存器类似于rbp寄存器 存储调用函数的下一条指令 供子函数返回父函数
PC寄存器类似于rip寄存器 存储当前执行的目标地址 不过要特别注意的是 arm架构的pc寄存器会存储当前执行的目标地址+8 (这里具体的数值待研究 不清楚32位和64位架构是否都是8)