1. 程式人生 > 其它 >ARM指令集的基礎知識

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位)