<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      一文搞懂 ARM 64 系列: 寄存器

      ARM 64中包含多種寄存器,下面介紹一些常見的寄存器。

      1 通用寄存器

      ARM 64包含3164bit寄存器,記為X0~X30

      每一個通用寄存器,它的低32bit都可以被訪問,記為W0~W30

      image

      在這31個通用寄存器中,有2個寄存器比較特殊。

      X29寄存器被作為棧幀寄存器,也被稱為FP(Frame Pointer Register)

      X30寄存器被作為函數返回地址寄存器,也被稱為LR(Link Register)

      下面從一個例子來看X29寄存器與X30寄存器的作用。

      // ARMAssemble`-[ViewController viewDidLoad]:
      0x104e94000 <+0>:  sub    sp, sp, #0x30
      0x104e94004 <+4>:  stp    x29, x30, [sp, #0x20]
      0x104e94008 <+8>:  add    x29, sp, #0x20
      ...
      

      上面代碼是一個VC viewDidLoad匯編方法的開頭部分。

      代碼第1行將棧寄存器SP的值減少0x30,也就是開辟了0x30的棧空間。

      代碼第2行將寄存器X29與寄存器X30存入(sp + 0x20)指向的地址。

      代碼第3行將(SP + 0x20)這個地址值寫入寄存器X29,形成新的棧幀FP

      image

      從上圖可以看到新FP存儲在寄存器X29,而上一個棧幀FP的值被存入到地址(SP + 0x20)。這樣,隨著函數一層一層調用,棧幀也被串聯起來。

      對于寄存器X30,可以使用image lookup -a命令查看其存儲的地址0x1c43df260代表的含義:

      (lldb) p/x $x30
      (unsigned long) 0x00000001c43df260
      (lldb) image lookup -a $x30
            Address: UIKitCore[0x0000000189353260] (UIKitCore.__TEXT.__text + 3665488)
            Summary: UIKitCore`-[UIViewController _sendViewDidLoadWithAppearanceProxyObjectTaggingEnabled] + 84
      

      從輸出看到,這個地址位于函數-[UIViewController _sendViewDidLoadWithAppearanceProxyObjectTaggingEnabled]中,正是這個函數調用了-[UIViewController viewDidLoad]。寄存器X30存儲的地址0x1c43df260正是viewDidLoad函數返回后,要執行的指令地址:

      // UIKitCore`-[UIViewController _sendViewDidLoadWithAppearanceProxyObjectTaggingEnabled]:
      ...
      0x1c43df25c <+80>:  bl     0x18a7b7e80 ; objc_msgSend$viewDidLoad
      // X30 的地址指向這行代碼
      0x1c43df260 <+84>:  mov    x0, x19
      

      上面代碼第1行調用函數-[UIViewController viewDidLoad]

      代碼第2行就是函數-[UIViewController viewDidLoad]返回后要執行的指令,其地址正好是0x1c43df260

      2 SP

      SP是棧頂指針寄存器,類似Intel 64中的RSP寄存器。

      3 PC

      PC寄存器存儲當前要執行的指令地址,類似Intel 64中的RIP寄存器。

      // ARMAssemble`-[ViewController viewDidLoad]:
      ->  0x104e94000 <+0>:  sub    sp, sp, #0x30
          0x104e94004 <+4>:  stp    x29, x30, [sp, #0x20]
          ...
      

      上面代碼第1行,正要執行0x104e94000地址處指令,打印寄存器PC的值,也正好是0x104e94000:

      (lldb) p/x $PC
      (unsigned long) 0x0000000104e94000
      

      4 SIMD&FP 寄存器

      SIMD是單指令多數據的縮寫(Signle Instruction,Multiple Data),FP代表浮點數(Float Point)。

      SIMD&FP寄存器有32個,記為V0~V31,每一個寄存器都是128bit

      當訪問SIMD&FP寄存器的全部128bit時,它們也可以被記為Q0~Q31

      當訪問SIMD&FP寄存器的低64bit時,它們被記為D0~D31,此時也是被當成浮點數寄存器使用。

      當訪問SIMD&FP寄存器的低32bit時,它們被記為S0~S31

      當訪問SIMD&FP寄存器的低16bit時,它們被記為H0~H31

      當訪問SIMD&FP寄存器的低8bit時,它們被記為B0~B31

      image

      如果一條指令包含寄存器Vn,寄存器Vn同時存儲比如432bit數據,這樣一條指令就包含了4個數據,也就是所謂的單指令多數據SIMD應用場景。

      在矩陣運算中,常常能看到SIMD的應用。

      5 Z 寄存器

      Z寄存器也就是標量向量寄存器(Scalable Vector Register)。

      ARM 64中有32Z寄存器,Z寄存器最低可以有128bit,最高有2048bit。具體長度有處理器實現決定。

      如果Z寄存器的長度是128bit,那么它其實就是一個SIMD&FP寄存器。

      image

      posted @ 2024-06-08 21:44  chaoguo1234  閱讀(4530)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 久久天天躁狠狠躁夜夜av | 国产亚洲无线码一区二区| 手机看片AV永久免费| 福利成人午夜国产一区| 国产在线观看网址不卡一区| 国产午夜精品理论大片| 无码精品人妻一区二区三区湄公河 | 国产中文字幕精品在线| 国产a在视频线精品视频下载| 日亚韩在线无码一区二区三区| 九九热在线观看视频精品| 精品91在线| 亚洲天堂av在线免费看| 最新国产精品精品视频| 日本道不卡一二三区视频| 欧美成人午夜在线观看视频| 伊人色综合久久天天小片| 国产精成人品日日拍夜夜| 日本伊人色综合网| 天堂a无码a无线孕交| 8x国产精品视频| 中文字幕亚洲国产精品| 资源在线观看视频一区二区| 国产嫩草精品网亚洲av| 亚洲国产精品一二三四五| 亚洲av无码牛牛影视在线二区| 国产一级特黄高清大片一| xxxx丰满少妇高潮| 欧美日韩精品一区二区三区高清视频| 国产精品v欧美精品∨日韩| 国产极品美女网站在线观看| 永久免费无码av在线网站| 丰满熟妇人妻中文字幕| 日韩精品一卡二卡在线观看| 久久人与动人物a级毛片 | 中文字幕av无码免费一区| 国产精品日韩av一区二区| 国产精品无码无卡在线观看久| 亚洲精品日韩中文字幕| 国产精品中文字幕av| 99国产欧美另类久久久精品|