2014-03-12 7 views
4

如何確定僅使用匯編語言運行ARM處理器的endian模式。如何確定處理器運行的endian模式?

我可以很容易地看到CPSR的Thumb/ARM狀態讀取位5,但我不知道CPSR或其他位置是否存在對應的位。

;silly example trying to execute ARM code when I may be in Thumb mode.... 
MRS R0,CPSR  
ANDS R0,#0x20 
BNE ThumbModeIsActive 
B ARMModeIsActive 

我有權訪問ARM7TDMI數據表,但本文檔不告訴我如何讀取當前狀態。
我用什麼彙編代碼來確定字節序?

讓我們假設我正在使用ARM9處理器。

回答

5

在ARMv4(ARM7TDMI)或ARMv5(ARM9)中沒有用於字節順序的CPSR位,所以您需要使用其他方法。

如果您的核心實現系統協處理器15,那麼你可以檢查寄存器1的第7位:

MRC p15, 0, r0, c1, c0 ; CP15 register 1 
TST r0, #0x80   ; check bit 7 (B) 
BNE big_endian 
B little_endian 

然而,DOC(ARM DDI 0100E)似乎暗示該位僅適用於在運行時可以配置字節序的系統。如果它由引腳設置,則該位可能是錯誤的。當然,在大多數(全部)ARM7內核中,CP15不存在。

有一個平臺無關的方式檢查endianness不需要任何硬件位。它是這樣的:

LDR R0, checkbytes 
    CMP R0, 0x12345678 
    BE big_endian 
    BNE little_endian 
checkbytes 
    DB 0x12, 0x34, 0x56, 0x78 

根據當前的字節順序,負載會產生要麼爲0x12345678或0x78563412。

+0

榮譽,當我試圖挖掘v6的東西時,我沒有看到你回答。 – auselen

4

ARMv6及更高版本允許您檢查CPSR位E(9)的字節順序。

在ARMv6協處理器15寄存器c1之前,bit 7應該告訴哪個endianness核心正在使用。

在這兩種情況下,1是big-endian,而0是little-endian。

+0

哦,太棒了,你可以擴展嗎? '1'是否對應BIG或小端? – Johan

+0

你也應該檢查另一個答案,因爲它也表明檢查字節順序的另一種方法。 – auselen

相關問題