共找到2條詞條名為偽指令的結果 展開
- 對彙編過程進行控制的指令
- 偽指令語句
偽指令
對彙編過程進行控制的指令
偽指令(PseudoInstruction)是用於對彙編過程進行控制的指令,該類指令並不是可執行指令,沒有機器代碼,只用於彙編過程中為彙編程序提供彙編信息。例如,提供如下信息:哪些是指令、哪些是數據及數據的字長、程序的起始地址和結束地址等。偽指令有2個特點:
(1)由於是偽“指令”,因而它只存在於彙編語言中。高級語言中不叫指令,叫語句;
(2)由於是“偽”指令,也即“假”指令,因而不是可執行指令,不會產生機器代碼,不會佔用ROM空間,只用於彙編過程中為彙編程序提供彙編信息。
偽指令是在編譯階段發揮作用的,由彙編器(MASM、TASM等)來解釋。
彙編版本老於ARMv6T2的處理器的Thumb指令時,ADRL是無效的。
偽指令
ADRLRd,label
其中:
cond
是一個可選的條件代碼(請參閱條件執行)。
Rd
是要載入的寄存器。
label
表達式,與程序或寄存器相關。有關詳細信息,請參閱相對寄存器和程序相對的表達式。
ADRL始終彙編為兩個32位指令。即使使用單個指令就可完成地址訪問,也會生成多餘的第二個地址。
如果彙編程序無法將地址構建為兩個指令,則它將生成一條錯誤消息,彙編將失敗。有關載入更寬範圍地址的信息,請參閱LDR偽指令(另請參閱將常數載入到寄存器)。
ADRL可生成與位置無關的代碼,因為地址與程序或寄存器有關。
如果label與程序有關,則其表示的地址必須要與ADRL偽指令在同一彙編程序區域內,請參閱AREA。
如果使用ADRL來為BX或BLX指令生成目標,則當目標中包含Thumb指令時,您就要自己設置地址的Thumb位(位0)。
可用範圍取決於所用的指令集:
ARM
±64KB到位元組或半字對齊的地址。
±256KB位元組,字對齊地址。
32位Thumb
±1MB位元組,位元組、半字或字對齊地址。
16位Thumb
ADRL不可用。
上面給出的範圍是相對於位於當前指令后的、離當前指令有四個位元組(在Thumb代碼中)或兩個字(在ARM代碼中)間隔的點而言的。在ARM和32位Thumb中,如果地址為16位元組對齊,或與該點的相對性更高,則相對地址的範圍可更大。
將以下項之一載入到寄存器:
一個32位常數值
任何地址。
MOV32始終會生成兩個32位指令,即一個MOV、MOVT對。您可利用它載入任何32位常數或訪問整個地址空間。
如果用MOV32載入地址,則所生成的代碼將與位置有關。
MOV32Rd,expr
其中:
cond
是一個可選的條件代碼(請參閱條件執行)。
Rd
是要載入數據的寄存器。Rd不可為sp或pc。
expr
可以是下列項之一:
symbol
程序區域中的標籤。
constant
任何32位常數。
symbol+constant
標籤加上32位常數。
MOV32偽指令的主要功能有:
當單個指令中無法生成立即數時,生成文字常數。
將相對於程序的地址或外部地址載入寄存器中。無論鏈接器將包含MOV32的ELF代碼段置於何處,該地址始終有效。
Note
以這種方式載入的地址是在鏈接時確定的,因此代碼不是位置無關的。
如果所引用的標籤位於Thumb代碼中,則MOV32將會設置該地址的Thumb位(位0)。
此偽指令在ARMv6T2和ARMv7中的ARM和Thumb狀態下均有效。
LDR偽指令
將以下項之一載入寄存器:
一個32位常數值
一個地址。
Note
本節僅介紹LDR偽指令。有關LDR指令的詳細信息,請參閱內存訪問指令。
有關使用LDR偽指令載入常數的信息,請參閱用LDRRd,=const載入。
語法
LDR{.w}Rt,=[expr|label‑expr]
其中:
cond
是一個可選的條件代碼(請參閱條件執行)。
.W
是可選的指令寬度說明符。
是要載入的寄存器。
expr
取值為一個數值常數:
如果expr的值位於範圍內,則彙編程序將會生成一個MOV或MVN指令。
如果expr的值不在MOV或MVN指令的範圍內,則彙編程序會將常數放入文字池中,並會生成一個相對於程序的LDR指令,該指令可從文字池中讀取此常數。
label‑expr
是一個與程序相關的表達式或外部表達式。彙編程序會將label‑expr的值放入文字池中,並會生成一個與程序有關的LDR指令,該指令可從文字池中載入該值。
如果label‑expr是一個外部表達式,或未包含在當前代碼段內,則彙編程序將會在目標文件中放入一個鏈接器重新定位指令。鏈接器將在鏈接時生成該地址。
如果label‑expr是一個局部標籤(請參閱局部標籤),則彙編程序會在目標文件中放入一個鏈接器重新定位指令,並會為該局部標籤生成一個符號。該地址將在鏈接時生成。如果局部標籤引用了Thumb代碼,則還會設置該地址的Thumb位(位0)。
Note
在RVCT2.2中,沒有對地址的Thumb位進行設置。如果此設置會影響您的代碼,則請使用命令行選項‑‑untyped_local_labels迫使彙編程序在引用Thumb代碼中的標籤時不設置Thumb位。
用法
LDR偽指令的主要功能如下:
當立即數由於超出了MOV和MVN指令的範圍,而不能被移入寄存器中時,生成文字常數。
將相對於程序的地址或外部地址載入寄存器中。無論鏈接器將包含LDR的ELF代碼段置於何處,該地址始終有效。
pc到文字池中的值的偏移量必須小於±4KB(ARM、32位Thumb‑2),或在0到+1KB(Thumb、16位Thumb‑2)範圍內。您必須確保有一個滿足範圍要求的文字池。有關詳細信息,請參閱LTORG。
如果所引用標籤在Thumb代碼中,LDR偽指令將會設置label‑expr的Thumb位(位0)。
有關如何使用LDR的詳細說明,以及有關MOV和MVN的詳細信息,請參閱將常數載入到寄存器。
Thumb代碼中的LDR
對於ARMv6T2及更高版本的Thumb代碼,您可以使用.W寬度說明符強制LDR生成32位指令。LDR.W始終生成32位指令,即使利用16位MOV就可完成常數的載入,或在16位pc相對載入範圍內有文字池。
如果在第一次彙編時,彙編程序尚不知道常數值的相關信息,則不帶.W的LDR將會在Thumb代碼中生成16位指令,即使這會導致對於可在32位MOV或MVN指令中生成的常數,會通過16位pc相對載入來完成其載入。但是,如果在第一次彙編時彙編程序就已經知道了該常數,並且該常數可以通過32位MOV或MVN指令生成,則將會使用MOV或MVN指令。
LDR偽指令不會生成16位標記設置MOV指令。可使用‑‑diag_warning1727彙編程序命令行選項來檢查是否使用了16位指令。
有關如何在不利用文字池載入的情況下來生成常數或地址的信息,請參閱MOV32偽指令。
示例
LDRr3,=0xff0;loads0xff0intor3
;=>MOV.Wr3,#0xff0
LDRr1,=0xfff;loads0xfffintor1
;=>LDRr1,[pc,offset_to_litpool]
;...
;litpoolDCD0xfff
LDRr2,=place;loadstheaddressof
;placeintor2
;=>LDRr2,[pc,offset_to_litpool]
;...
偽指令符(常數或表達式)
其中:
1、偽指令符是偽指令的名稱
2、常數或表達式是偽指令的參數,括弧表示可有可無
51單片機最常用的偽指令如下:
(1)起始(Origin)偽指令
標號:ORGnn
功能:定義程序或數據塊的起始地址。指示此語句後面的程序或數據塊以nn為起始地址連續存放在程序存儲器中。
例如:
ORG2000H
MOVA,20H
…
ORG偽指令規定了程序的起始地址從2000H開始,即該程序的第一條指令“MOVA,20H”從地址2000H開始存放。)
(2)位元組定義(DefineByte)偽指令
標號:DB(位元組常數或字元或表達式)
功能:指示在程序存儲器中以標號為起始地址的單元里存放的數為位元組數據(8位二進位數)。
例如:
OGR100H
TAB1:DB0FFH,'C',16,−1
從TAB1開始的地址單元依次存放0FFH、43H、10H、0FFH
其中,TAB1=100H(ORG指定);C的ASCII碼為43H;十進位16的十六進位為10H,-1的補碼為FFH
(3)字定義(DefineWord)偽指令
標號:DW(字常數或表達式)
功能:指示在程序存儲器中以標號為起始地址的單元里存放的數為字數據(16位的二進位數)。
例如:
OGR100H
TAB3:DW5678H,10
其中,TAB3=100H(ORG指定);ROM中的存放情況為:(100H)=56H、(101H)=78H、(102H)=00H、(103H)=0AH
(4)保留位元組(DefineStorage)偽指令
標號:DS(數值表達式)
功能:指示在程序存儲器中保留以標號為起始地址
的若干位元組單元,其單元個數由數值表達式指定。
例如:
TAB2:DS16;從TAB2地址開始保留16個存儲單元
(5)等值(Equate)偽指令
標號:EQU(數值表達式)
功能:表示EQU兩邊的量等值,用於為標號或標識符賦值。
例如:
X1EQU2000H
X2EQU0FH
…
MAIN:
MOVDPTR,#X1;DPTR=2000H
ADDA,#X2;A=A+0FH
(6)位定義偽指令
標號:BIT(位地址)
功能:同EQU指令,不過定義的是位操作地址。
例如:
ENABITP2.2
(7)彙編結束偽指令
標號:END
功能:指示源程序段結束。END指令放在程序的最後。若將END放在程序中間,那麼對於END後面的指令,彙編程序將不對其進行彙編。一個彙編語言源程序僅允許使用一個END偽指令。
生成無體系結構定義的指令。執行未定義指令會引發未定義指令異常。請讓無體系結構定義的指令保持在未定義狀態。
語法
UND{.w}{#expr}
其中:
cond
是一個可選的條件代碼(請參閱條件執行)。對於ARM代碼或16位Thumb代碼,不允許此偽指令使用cond。
.W
是可選的指令寬度說明符。
expr
取值為一定範圍內的數值常數:
對於ARM代碼,為0-65535
對於32位Thumb代碼,為0-4095
對於16位Thumb代碼,為0-255。
如果省略了expr,則使用的值為0。
Thumb代碼中的UND
對於ARMv6T2及更高版本處理器的Thumb代碼,您可利用.W寬度說明符強制UND生成32位指令。UND.W始終生成32位指令,即使expr在0-255範圍之內。
此偽指令生成的編碼將反彙編為DCI。
;litpoolDCDplace
大學彙編課本中主要介紹的偽指令:
(1)assume段寄存器名:段名
假設(將段與CPU中段寄存器聯繫起來)
(2)段名segment開始
段名ends結束(成對出現)
(3)ends(整個程序結束)