Arm 如何确定处理器运行的endian模式?

Arm 如何确定处理器运行的endian模式?,arm,endianness,Arm,Endianness,如何仅使用汇编语言确定ARM处理器运行的endian模式 我可以很容易地看到CPSR的拇指/手臂状态读取位5,但我不知道CPSR或其他地方是否有对应的endianness位 ;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数据表

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

我可以很容易地看到CPSR的拇指/手臂状态读取位5,但我不知道CPSR或其他地方是否有对应的endianness位

;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处理器。

ARMv6和更高版本允许您检查
CPSR
位E(9)的端性

在ARMv6协处理器15之前,寄存器c1位7应告知使用的是哪个endianness内核


在这两种情况下,
1
都是大端,而
0
是小端。

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)似乎暗示,此位仅对endianness在运行时可配置的系统有效。如果是由引脚设置的,则位可能错误。当然,在大多数(所有?)ARM7内核上,CP15并不存在

有一种与平台无关的检查端点的方法,它不需要任何硬件位。事情是这样的:

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

根据当前的端度,加载将产生0x12345678或0x78563412。

哦,太好了,你能扩展一下吗?“1”对应的是大的endian还是小的endian?你还应该检查另一个答案,因为它也暗示了检查endian的另一种方法。太好了,我在尝试挖掘v6内容时没有看到你回答。