ARM指令集的基础知识

在这段时间,熟悉了一下ARM指令集的基础知识,在此记录方便以后学习

arm简介: 

  ctf的比赛中,大部分的题目都是x86,x86_64的程序,这类程序属于intel处理器支持的,但在现实生活中如Android,网络设备,智能家居等ARM的处理器要多的多

  intel和arm的主要区别是指令集:

    *cisc复杂指令集

    *risc精简指令集

  精简指令集通过减少每条指令的时钟周期来缩短执行时间,可以更快的执行指令,但因为指令较少,所以实现功能时显得,会显得比intel 长

  其次,在x86中,大多数的指令都可以直接对内存中的数据进行操作,而在ARM上,必须将内存中的数据转移到寄存器上,然后才可以操作

  intel和arm的更多差别是:

    在arm中,大多数指令用于条件执行

    在intel x86和x86-64系列处理器用little-endian格式

    在v3之前 arm的体系结构为little-endian字节序,此后,arm处理器成为Bl-endian,并允许可切换字节序

ARM数据类型和寄存器:

  字节序:

    有俩种查看字节的基本方法:小端和大端,在arm体系中具有允许可切换字节序的设置

  寄存器:(最重要的终于终于来了)

    寄存器的数量取决于arm版本

       32位:在32位中有30个通用寄存器,前16个寄存器可在用户模式下访问,其它寄存器需要在特权软件执行中使用,其中r0-r15寄存器可在任何特权模式下使用,这16个寄存器可以分为俩组:通用寄存器(r0-r11)和专用寄存器(r12-r15)

       R0-r12:可在常规操作期间用于存储临时值

        R0:在算术操作期间可称为累加器,用于存储先前调用函数结果(题外话我觉得像rax)

        R7:用于存储系统调用号!!!!!(重点)

        R11用来帮助我们跟踪用作帧指针的堆栈的边界

        在arm的系统调用的前四个参数存储在r0-r3!!!!(重点)

        R13:sp(堆栈指针)堆栈指针指向堆栈的顶部

        R14:LR(链接寄存器),在进行功能调用时,链接寄存器将使用一个内存地址进行更新,该内存地址引用了从其开始该功能的下一条指令,这样做可以使程序返回到"父“函数,改函数在子函数完成后启动子函数系统调用

        R15:PC(程序计数器)程序计数器自动增加执行指令的大小,在ARM的状态下,此大小始终为4个字节,在thumb模式下,此大小始终为2个字节,当实行转移指令时,pc保留目标地址,在执行期间,pc在arm状态下加8(thumb模式下加四),这和x86

          下不同,x86的pc始终指向下一条指令

           

 

 

 

         当参数少于四个的时候,子程序间通过寄存器r0-r3来传递参数,当多于四个的时候,通过栈来传递参数

        在子程序中,使用R4-R11保存局部变量,若使用 需要入栈保存,子程序返回前需要恢复这些寄存器,R12是临时寄存器不需要恢复

        子程序返回32位的的整数时,使用r0返回,当返回64位的整数时,使用r0返回低位,r1返回高位

      64位:

        子程序调用必须要保存的寄存器x19~x29和sp(x31),不需要保存的寄存器x0~x7,x9~x15

 

 

ARM指令集:

  arm处理器中有俩种可以运行的主要状态,(此处不包括lazelle):arm和thumb,这俩种状态的主要区别时指令集,其中arm的指令始终为32为,tmumb下的指令始终为16位(也可以为32位),现在,ARM加入了增强的tmumb指令集(tmumbv2)

 

 

 

 

 

 

 结束!!!!

  

 

posted @ 2022-03-01 11:35  庄周恋蝶蝶恋花  阅读(477)  评论(0编辑  收藏  举报