为什么要学ARM64?android 5.0系统就开始引入Arm64-v8a,它用于支持全新的AArch64架构,这个架构也就是我们要学习的arm64汇编。目前android系统已经发展到anroid 11版本。因此现在主流的apk都是支持AArch64架构。那么我们利用IDA(反汇编工具)进行静态逆向分析so文件、或者IDA动态调试so文件,都需要和arm64汇编代码打交道,因此对于学习掌握好ARM64汇编对阅读反汇编代码能达到事半功倍的效果。 ARM64汇编由什么组成的?· 汇编中共有34个寄存器。其中包括31个通用寄存器、SP寄存器、PC寄存器,CPSR寄存器。·31个通用寄存器中: 通用寄存器作用是什么?·在汇编代码中使用 X0 - X30寄存器进行访问操作数据时,它就表示的是一个64位的数据。·在汇编代码中使用 W0 - W30寄存器进行访问操作数据时,它表示的是一个32位的数据。 栈寄存器是什么怎么用?1.栈结构及作用? 栈是一种具有特殊的访问方式的存储空间,先进后出(后进先出),它是从高地址到低地址的, 栈底是高地址,栈顶是低地址。 2. 栈寄存器表示指令有那些? SP:栈顶寄存器 3. 操作栈寄存器的有那些指令? STP指令:表示入栈指令 出栈操作的汇编代码片段 状态寄存器由那些状态组成?ARM64的汇编指令集中,有一部分指令的执行时影响状态寄存器的,比如add、sub、or汇编指令等,他们大都是运算指令(进行逻辑或算数运算) CPSR的低8位(包括I、F、T和M[0~4])称为控制位,程序无法修改,除非CPU运行于特权模式下,程序才能修改控制位! N、Z、C、V均为条件码标志位。它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。 1. N(Negative)标志 CPSR的第31位是 N,符号标志位。它记录相关指令执行后,其结果是否为负。如果为负 N = 1,如果是非负数 N = 0。 2. Z(Zero)标志 CPSR的第30位是Z,零标志位。它记录相关指令执行后,其结果是否为0。如果结果为0,那么Z = 1;如果结果不为0,那么Z = 0。 3. C(Carry)标志 CPSR的第29位是C,进位标志位。一般情况下,进行无符号数的运算。 4. V(Overflow)溢出标志 CPSR的第28位是V,溢出标志位。在进行有符号数运算的时候,如果超过了机器所能标识的范围,称为溢出。 ARM64特有的汇编指令·adrp指令(address page) 它是一条地址读取指令,是用于计算指定的数据地址到当前PC值的相对偏移。 得到一个大小为4KB的页的基址,而且在该页中有全局变量g的地址;ADRP就是讲该页的基址存到寄存器X6中; ·内存读写指令(ldr、ldur、ldp, str、stur、stp) STR、STP、STUR为存储数据指令(注:以ST开头的表示为存储指令) LDR指令:将数据从内存中取出来,存放到寄存器中。 ARM64汇编的函数有那些需要重点关注?1.函数调用约定是什么约定?
3.3.2 函数中有九个参数的,需要用栈寄存器来传递参数 源代码: ARM64汇编代码: 4.函数中的堆栈怎么平衡?
|
|