如何确定处理器运行的字节序模式?

时间:2014-03-12 14:24:40

标签: arm endianness

如何仅使用汇编语言确定ARM处理器运行的字节序模式。

我可以很容易地看到Thumb / ARM状态读取CPSR的第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处理器。

2 个答案:

答案 0 :(得分: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不存在。

有一种独立于平台的检查字节顺序的方法,不需要任何硬件位。它是这样的:

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

根据当前的字节序,负载将产生0x12345678或0x78563412。

答案 1 :(得分:4)

ARMv6及更高版本允许您检查CPSR位E(9)的字节顺序。

在ARMv6协处理器15寄存器c1之前,第7位应该告诉哪个字节序正在使用核心。

在这两种情况下,1都是big-endian而0是little-endian。