⑴ 使用ARM匯編偽指令編程:分別將兩個無符號數放在寄存器R0和R1中,求其中較大的那個數的階乘
你好,這里的回答應當與ARM相似下面我做一個簡單的ARM匯編語言描述
ARM中偽指令不是真正的ARM指令或者Thumb指令,這些偽指令在匯編編譯時對源程序進行匯編處理時被替換成對應的ARM或Thumb指令(序列)。ARM偽指令包括ADR、ADRL、LDR和NOP等。
1、ADR(小范圍的地址讀取偽指令)
該指令將基於PC的地址值或基於寄存器的地址值讀取到寄存器中。
語法格式
ADR{cond} register, expr
其中,cond為可選的指令執行的條件
register為目標寄存器
expr為基於PC或者基於寄存器的地址表達式,其取值范圍如下:
當地址值不是字對齊時,其取值范圍為-255~255.
當地址值是字對齊時,其取值范圍為-1020~1020
當地址值是16位元組對齊時,其取值范圍將更大
在匯編編譯器處理源程序時,ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現該ADR偽指令的功能。
因為ADR偽指令中的地址是基於PC或者基於寄存器的,所以ADR讀取到的地址為位置無關的地址。當ADR偽指令中的地址是基於PC時,該地址與ADR偽指令必須在同一個代碼段中。
示例
start MOV r0,#10 ;因為PC值為當前指令地址值加8位元組
ADR r4, start ;本ADR偽指令將被編譯器替換成SUB r4,pc,#0xc
2、 ADRL(中等范圍的地址讀取偽指令)
該指令將基於PC或基於寄存器的地址值讀取到寄存器中。ADRL偽指令比ADR偽指令可以讀取更大范圍的地址。ADRL偽指令在匯編時被編譯器替換成兩條指令,即使一條指令可以完成該偽指令的功能。
語法格式
ADRL{cond} register,expr
示例
start MOV r0,#10 ;因為PC值為當前指令地址值加8位元組
ADRL r4,start+60000 ;本ADRL偽指令將被編譯器替換成下面兩條指令
ADD r4,pc,#0xe800
ADD r4,r4,#0x254
3、LDR(大范圍的地址讀取偽指令)
LDR偽指令將一個32位的常數或者一個地址值讀取到寄存器中
語法格式
LDR{cond} register, =[expr|label-expr]
其中,expr為32位的常量。編譯器將根據expr的取值情況,如下處理LDR偽指令:
當expr表示的地址值沒有超過MOV或MVN指令中地址的取值范圍時,編譯器用合適的MOV或MVN指令代替該LDR偽指令
當expr表示的地址值超過了MOV或者MVN指令中地址的取值范圍時,編譯器將該常數放在數據緩沖區中,同時用一條基於PC的LDR指令讀取該常數。
label-expr為基於PC的地址表達式或者是外部表達式。當label-expr為基於PC的地址表達式時,編譯器將label-expr表示的數值放在數據緩沖區(literal pool)中,然後將該LDR偽指令處理成一條基於PC到該數據緩沖區單元的LDR指令,從而將該地址值讀取到寄存器中。這時,要求該數據緩沖區單元到PC的距離小於4KB。當label-expr為外部表達式,或者非當前段的表達式時,匯編編譯器將在目標文件中插入一個地址重定位偽操作,這樣連接器將在連接時生成該地址。
LDR偽指令主要有以下兩種用途:
當需要讀取到寄存器中的數據超過了MOV及MVN指令可以操作的范圍時,可以使用LDR偽指令將該數據讀取到寄存器中。
將一個基於PC的地址值或者外部的地址值讀取到寄存器中。由於這種地址值是在連接時確定的,所以這種代碼不是位置無關的。同時LDR偽指令的PC值到數據緩沖區中的目標數據所在的地址的偏移量要小於4KB。
示例
將0xff0讀取到R1中
LDR R1,=0xFF0
匯編後將得到:
MOV R1,0xFF0
將0xfff讀取到R1中
LDR R1,=0xFFF
匯編後將得到:
LDR R1,[PC,OFFSET_TO_LPOOL]
…
LPOOL DCD 0xFFF
將外部地址ADDR1讀取到R1中
LDR R1,=ADDR1
匯編後將得到:
LDR R1,[PC,OFFSET_TO_LPOOL]
…
LPOOL DCD ADDR1
4、NOP空操作偽指令
在匯編時將被替換成ARM中的空操作,如MOV R0,R0
NOP偽指令不影響CPSR中的條件標志位
以上是對ARM匯編語言的回答描述,望採納。謝謝
⑵ 偽指令MOV32 偽指令
偽指令MOV32和LDR在ARM處理器中用於數據載入操作,它們的用途和使用方法有所不同,本文將詳細解釋兩者之間的區別。
偽指令MOV32主要功能是載入32位常數或訪問整個地址空間。其語法為:MOV32 Rd, expr。其中,cond為可選的條件代碼(請參閱條件執行),Rd是要載入數據的寄存器(Rd不可為sp或pc),expr可以是符號、常數或符號加上常數。使用MOV32載入地址時,生成的代碼將與位置有關,且以這種方式載入的地址是在鏈接時確定的,因此代碼不是位置無關的。
偽指令LDR用於將常數或地址載入寄存器。其語法為:LDR{.w} Rt,=[expr | label-expr]。其中,cond為可選的條件代碼(請參閱條件執行),.W為可選的指令寬度說明符,Rt是要載入的寄存器。expr的值可以是一個數值常數,如果值位於范圍內則生成一個MOV或MVN指令,否則生成一個相對於程序的LDR指令;label-expr可以是一個與程序相關的表達式或外部表達式,匯編程序將值放入文字池中,並生成與程序相關的LDR指令。
偽指令LDR的主要功能包括當立即數超出MOV和MVN指令范圍時生成文字常數,將相對於程序的地址或外部地址載入寄存器中,無論鏈接器將包含LDR的ELF代碼段置於何處,該地址始終有效。以這種方式載入的地址是在鏈接時確定的,因此代碼不是位置無關的。
偽指令MOV32和LDR在ARMv6T2和ARMv7中都有效,但它們在Thumb狀態下的行為有所不同。在Thumb狀態下,LDR指令可以在32位和16位寬度下使用,但MOV32指令僅在ARM狀態下可用。
在實際編程中,選擇使用MOV32還是LDR取決於需要載入的數據類型和位置。如果需要載入32位常數或需要訪問整個地址空間,則使用MOV32更為合適;如果需要載入常數或地址,且數據大小不確定時,則使用LDR更為靈活。
用於告訴匯編程序如何進行匯編的指令,它既不控制機器的操作也不被匯編成機器代碼,只能為匯編程序所識別並指導匯編如何進行。 將相對於程序或相對於寄存器的地址載入寄存器中。 與 ADR 指令相似。ADRL 所載入的地址比 ADR 所載入的地址更寬,因為它可生成兩個數據處理指令。
⑶ 匯編語言 ENTRY 是什麼指令
在ARM匯編中,ENTRY 是一個偽指令,用於指定匯編程序的入口點。在一個較大型的完整的匯編程序(多個源文件組成的工程)中至少要有一個ENTRY(也可以有多個,當有多個ENTRY時,程序的真正入口點由鏈接器指定),但在某一個源文件里最多隻能有一個ENTRY(可以沒有)。
⑷ ARM匯編語言由哪些指令組成它們之間的區別是什麼
機器指令能被處理器直接執行,而匯編指令、偽指令和宏指令不能。機器指令包括ARM指令集和Thumb指令集 。
偽指令是在源程序匯編期間,由匯編編譯器處理。其作用是為匯編程序完成准備工作。
宏指令在程序中用於調用宏,宏是一段獨立的程序代碼;在程序匯編時,對宏調用進行展開,用宏體代替宏指令。