日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

反汇编学习笔记2 函数的本质

發布時間:2024/4/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 反汇编学习笔记2 函数的本质 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

函數本質

##關于CPU的補充

寄存器

CPU除了有控制器、運算器還有寄存器。其中寄存器的作用就是進行數據的臨時存儲。

CPU的運算速度是非常快的,為了性能CPU在內部開辟一小塊臨時存儲區域,并在進行運算時先將數據從內存復制到這一小塊臨時存儲區域中,運算時就在這一小快臨時存儲區域內進行。我們稱這一小塊臨時存儲區域為寄存器。

對于arm64系的CPU來說, 如果寄存器以x開頭則表明的是一個64位的寄存器,如果以w開頭則表明是一個32位的寄存器,在系統中沒有提供16位和8位的寄存器供訪問和使用。其中32位的寄存器是64位寄存器的低32位部分并不是獨立存在的。

高速緩存

iPhoneX上搭載的ARM處理器A11它的1級緩存的容量是64KB,2級緩存的容量8M.

CPU每執行一條指令前都需要從內存中將指令讀取到CPU內并執行。而寄存器的運行速度相比內存讀寫要快很多,為了性能,CPU還集成了一個高速緩存存儲區域.當程序在運行時,先將要執行的指令代碼以及數據復制到高速緩存中去(由操作系統完成).CPU直接從高速緩存依次讀取指令來執行.

寄存器的補充

數據地址寄存器

數據地址寄存器通常用來做數據計算的臨時存儲、做累加、計數、地址保存等功能。定義這些寄存器的作用主要是用于在CPU指令中保存操作數,在CPU中當做一些常規變量來使用。 ARM64中

  • 64位: X0-X30, XZR(零寄存器)
  • 32位: W0-W30, WZR(零寄存器)

注意: 之前講解8086匯編中有一種特殊的寄存器段寄存器:CS,DS,SS,ES四個寄存器來保存這些段的基地址,這個屬于Intel架構CPU中.在ARM中并沒有

浮點和向量寄存器

因為浮點數的存儲以及其運算的特殊性,CPU中專門提供浮點數寄存器來處理浮點數

  • 浮點寄存器 64位: D0 - D31 32位: S0 - S31

現在的CPU支持向量運算.(向量運算在圖形處理相關的領域用得非常的多)為了支持向量計算系統了也提供了眾多的向量寄存器.

  • 向量寄存器 128位:V0-V31

  • 棧:是一種具有特殊的訪問方式的存儲空間(后進先出, Last In Out Firt,LIFO)

SP和FP寄存器

  • sp寄存器在任意時刻會保存我們棧頂的地址.
  • fp寄存器也稱為x29寄存器屬于通用寄存器,但是在某些時刻我們利用它保存棧底的地址!()

注意:ARM64開始,取消32位的 LDM,STM,PUSH,POP指令! 取而代之的是ldr\ldp str\stp ARM64里面 對棧的操作是16字節對齊的!!

關于內存讀寫指令

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

str(store register)指令

將數據從寄存器中讀出來,存到內存中.

ldr(load register)指令

將數據從內存中讀出來,存到寄存器中

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

###堆棧操作練習 使用32個字節空間作為這段程序的棧空間,然后利用棧將x0和x1的值進行交換.

sub sp, sp, #0x20 ;拉伸棧空間32個字節 stp x0, x1, [sp, #0x10] ;sp往上加16個字節,存放x0 和 x1 ldp x1, x0, [sp, #0x10] ;將sp偏移16個字節的值取出來,放入x1 和 x0 復制代碼

bl和ret指令

bl標號

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

ret

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

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

x30寄存器

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

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

函數的參數和返回值

ARM64下,函數的參數是存放在X0到X7(W0到W7)這8個寄存器里面的.如果超過8個參數,就會入棧. 函數的返回值是放在X0 寄存器里面的.

函數的局部變量

函數的局部變量放在棧里面!

總結

以上是生活随笔為你收集整理的反汇编学习笔记2 函数的本质的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。