分析反編譯的 ARM 二進制檔案時,我遇到了這些說明
...
mov r7, #0
uxth r0, r7
...
add r7, r7, #1
uxth r4, r7
...
來自 ARM 檔案:
UXTH{cond} {Rd}, Rm {,rotation}將 16 位值擴展為 32 位值。它通過以下方式做到這一點:
- 將 Rm 中的值右移 0、8、16 或 24 位。
- 從獲得的值中提取 bits[15:0]。
- 零擴展到 32 位。
這真的讓我很困惑,并提出了很多問題:
- mov 不是已經在 32 位暫存器上運行了嗎?
- 使用零擴展零的目的是什么
uxth? - 為什么不直接將值加載到 r0 中?
uj5u.com熱心網友回復:
如果我錯了,請糾正我,但似乎它只是在做一個ANDwith 0xffff。
uxth r4, r7
讓我們按順序應用手冊中寫的操作。
1. 將 Rm 中的值向右回圈 0、8、16 或 24 位。
這沒有設定,所以沒有旋轉。
2.從獲得的值中提取bits[15:0]。
3. 零擴展到 32 位。
這些步驟加起來是一樣的& 0xffff。
所以基本上它& 0xffff 是以一種不必要的復雜方式撰寫的。糟糕,即使是編譯器也會生成此代碼,因此這似乎是在 32 位 ARM 中零擴展 16 位的標準方法。對不起,錯誤資訊。
mov r7, #0
uxth r0, r7
這些行可能是故意以復雜的方式撰寫的,或者是來自未優化的編譯,或者編譯器即使優化也很糟糕。做吧mov r0, #0。
不知何故,uxth 讀起來像 ux??..
uj5u.com熱心網友回復:
該指令旨在幫助處理 16 位變數。你的立即行動沒有多大意義,但如果我在地址 0x1001 有一個 16 位變數怎么辦?為了避免未對齊的訪問,您需要執行 32 位加載,然后右移 8 并使用 0x0000FFFF (這會自動為您提供符號擴展名。通常要執行此操作,您需要另一個暫存器和幾條指令。現在它有兩條指令不一定需要另一個暫存器。在此之前你會看到左移 16 然后右移以避免暫存器給出掩碼和零填充,但這是兩條指令。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/495927.html
上一篇:這個ld1{v4.16b-v7.16b},[x10]是什么樣的匯編指令?
下一篇:關于esp堆疊平衡
