ARM學習筆記9——ARM匯編匯編語言中的偽指令


  ARN匯編器支持ARM偽指令,這些偽指令在匯編階段被翻譯成ARM或Thumb指令。ARM偽指令包含ADR、ADRL、MOV32和LDR。
一、ADR偽指令
  1、作用
    ADR是小范圍地址讀取偽指令,基於PC相對偏移地址或基於寄存器相對偏移地址讀取到寄存器中,當地址值是字節對齊時,取值范圍為-255到255,當地址值是字對齊時,取值范圍-1020到1020
  2、語法格式
    ADR{<condition>}{.W} register,label
  3、參數說明
    3.1、.W:可選項,指定指令寬度
    3.2、register:目標寄存器
    3.3、label:基於PC或具有寄存器的表達式

二、ADRL偽指令
  1、作用
    ADRL是中等范圍地址讀取偽指令,基於PC相對偏移的地址或基於寄存器相對偏移的地址值讀取到寄存器中,當地址值是字節對齊時,取值范圍為-64KB到64KB,當地址值是字對齊時,取值范圍為-256KB到256KB。
  2、語法格式
ADRL{<condition>} register,label
  3、參數說明
    3.1、register:目標寄存器
    3.2、label:基於PC或具體寄存器的表達式
  4、與ADR的區別
    ADRL偽指令比ADR偽指令可以讀取更大范圍的地址,這是因為在編譯階段,ADRL偽指令被編譯器換成兩條指令。如果匯編器不能再兩條指令內完成操作,將報告錯誤,終止編譯。

三、LDR偽指令
  1、作用
    裝載一個32位常數和一個地址到寄存器
  2、語法格式
    LDR{<condition>}{.W} register,=[expr|label-expr]
  3、參數說明
    3.1、.W:指定指令寬度
    3.2、register:目標寄存器
    3.3、expr:32位常量表達式,匯編器根據expr的取值情況,對LDR偽指令做如下處理:
      3.3.1、當expr表示的地址值沒有超過MOV或MVN指令的地址取值范圍時,匯編器用一對MOV和MVN指令代替LDR指令。
      3.3.2、當expr表示的指令地址超過了MOV或MVN指令的地址范圍時,匯編器將常量放在數據緩存池,同時用一條基於PC的LDR指令讀取該常量。
    3.4、label-expr:一個程序相關或聲明為外部的表達式
  4、舉例
    將常數0xff0讀到r1中
    LDR r3,=0xff0,相當於:MOV r3,#0xff0(注:由於帶立即數的指令會因為ARM32位等寬造成指令限制,導致有些情況下用偽指令代替操作立即數的指令,如:MOV r3,0x123,此時會報錯“invalid constant (123) after fixup”)

四、NOP偽指令
  1、作用
    執行一條空操作,多用於延時,該指令一般被替換成如:mov r0,r0這樣一條指令
  2、語法格式
    NOP

 


免責聲明!

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



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