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