ARM中如何將任意32位立即數傳入寄存器中?


大家知道arm指令集是定長32位的,那32位的立即數尋址哪來的呢?
ARM 立即數有3種形式:
1、8 位,這種立即數就包含在指令中,裝入寄存器的最低 8 位,並且可以選擇 0 擴展或 符號位擴展到整個 32 位。
2、8 位移位+重復,到 32 位,這種立即數也包含在指令中,8 位立即數可以左移任意位,並且重復累加,指令形式比較復雜,可以裝入類似這些數據:0x55000000(8位數據 0x55 左移 24 位),0xe000e000(8 位數據 0xe0 左移 8 位,並且重復到高 16 位)。
3、對於不符合以上兩種格式的立即數,比如 0x12345678 這種,立即數不包含在指令中,而放在代碼段(通常是函數的結束之后),裝入的指令為 LDR Rd, [PC, #offset],即立即數是位於以 PC為基址加上一個偏移量的地址處。
通常理解的立即數,應該是把數據裝入寄存器的那條CPU指令,使用了“立即尋址”的尋址方式,而嚴格來說,只有前兩種形式的立即數是立即尋址,而第3種不算。
由於當前 PC 到函數末尾的長度,人工基本沒法算,所以這個工作(在合適的位置放入立即數,以及計算 offset)一般都由匯編器或編譯器自動安排。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM