ARM匯編指令

關于arm64匯編指令,如下圖

匯編指令.png

匯編指令可以匯總如下:(后續會更新)

匯編指令.png

關于內存讀寫指令

注意:讀/寫 數據是都是往高地址讀/寫

str(store register)指令

將數據從寄存器( Stack Register)中讀出來,存到內存中.

ldr(load register)指令

將數據從內存中讀出來,存到寄存器( Stack Register)中

此ldr 和 str 的變種ldp 和 stp 還可以操作2個寄存器.

bl指令
跳轉

bl指令

  • CPU從何處執行指令是由pc中的內容決定的,我們可以通過改變pc的內容來控制CPU執行目標指令

  • ARM64提供了一個mov指令(傳送指令),可以用來修改大部分寄存器的值,比如

    • mov x0,#10、mov x1,#20
  • 但是,mov指令不能用于設置pc的值,ARM64沒有提供這樣的功能

  • ARM64提供了另外的指令來修改PC的值,這些指令統稱為轉移指令,最簡單的是bl指令

bl指令 -- 練習

現在有兩段代碼!假設程序先執行A,請寫出指令執行順序.最終寄存器x0的值是多少?

_A:
    mov x0,#0xa0
    mov x1,#0x00
    add x1, x0, #0x14
    mov x0,x1
    bl _B
    mov x0,#0x0
    ret

_B:
    add x0, x0, #0x10
    ret

bl和ret指令

bl標號

  • 將下一條指令的地址放入lr(x30)寄存器
  • 轉到標號處執行指令

ret

  • 默認使用lr(x30)寄存器的值,通過底層指令提示CPU此處作為下條指令地址!

ARM64平臺的特色指令,它面向硬件做了優化處理的

adrp指令

是計算指定的數據地址 到當前PC值的相對偏移
由于得到的結果是低12bit為0
舉例:adrp x0,1
1、將1的值左移12位 1,0000,0000,0000 == 0x1000
2、將PC寄存器的低12位清零 比如: 0x1002e6123 ==> 0x1002e6000
3、將步驟1和2的值相加的結果 給 X0寄存器!!0x1002e7000
尋找常量的地址經常會用到這個指令


haha.png

x30寄存器

x30寄存器存放的是函數的返回地址.當ret指令執行時刻,會尋找x30寄存器保存的地址值!

注意:在函數嵌套調用的時候.需要講x30入棧!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。