影响ARM中内存负载的字节序

时间:2016-04-24 04:30:31

标签: assembly arm

在阅读我在C中编写的代码的反汇编时,我发现了.word.byte指令,我想知道他们到底做了什么。如果我在ARM中有以下代码

some_data:
    .byte 0x01, 0x02, 0x03, 20

我执行以下代码

movw r1, #lower16:some_data
movt r1, #upper16:some_data
ldrb r2, [r1, #0]

假设处理器处于小端模式,那么r2的内容是什么?是0x01还是20?如果我使用.word汇编程序指令而不是以下

,该怎么办?
some_data:
    .word 0x01020304

2 个答案:

答案 0 :(得分:3)

使用LDRB指令,CPU字节顺序无关紧要。它总是读取给定地址的字节。对于.word示例,如果汇编程序处于小端模式,则字0x01020304的第一个字节是最低有效字节或0x04。

答案 1 :(得分:2)

这显然是RTM的事情。较老的pre-armv6手臂是字不变的或BE-32,因为它现在称之为手臂。 armv6及更高版本是字节不变的。请参阅arm文档和汇编程序文档。

你在这里问两个问题,或者三个或更多问题。

1)您似乎对ldrb在任一模式下返回的内容感到好奇。 Armv6及更高版本是字节不变的,因此无论您在同一字节指令(ldrb或strb)中的哪种模式都以相同的方式在内存中的相同字节上运行。 armv4和armv5是单词不变量,意味着单词操作(ldr,str,stm,ldm)以与endian设置无关的相同方式操作。意味着这些体系结构上的字节操作是受字节序影响的事实,实际上是。

2)我的汇编器对.word或.byte做了什么,以及它如何将它放在内存中。汇编语言由汇编程序(您正在使用的软件)定义。没有标准,即使有,也不意味着人们必须遵循它。如果您认为arm文档是标准的那么为什么最受欢迎的arm汇编程序不遵循它?汇编语言由汇编程序定义,因此您使用的是汇编程序,具体的版本,具体的命令行选项或指令,以及源代码基于编译该工具时使用的选项?除了说尝试之外,我们不能回答......如果不是在线询问问题的时间相同,当然如果你加入等待答案的时间。

so.s

.byte 0x01,0x02,0x03,20
.word 0x01020304

然后尝试

arm-none-eabi-as so.s -o so.o
arm-none-eabi-objdump -D so.o 

so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <.text>:
   0:   14030201    strne   r0, [r3], #-513 ; 0xfffffdff
   4:   01020304    tsteq   r2, r4, lsl #6

arm-none-eabi-objcopy so.o -O binary so.bin
hexdump -C so.bin 
00000000  01 02 03 14 04 03 02 01                           |........|
00000008

所以,我的汇编程序的问题的许多可能答案之一。

3)那么运行时会发生什么,这真的是问题1,但你把两者结合在一起,我是如何组装我的代码以及它是如何将数据放入内存的,结合我在什么模式下构建的特别指示。

如果不写上述任何内容,你问题的答案就是&#34;它取决于&#34;假设您对r1所持有的术语是some_data开头的对齐地址(低两位0),some_data在字边界对齐。 (尽管你认为所有的arm架构都支持不对齐的访问,但是它们根据体系结构不同地支持它们ldrb不是未对齐的,但是工具可能不关心,取决于并且放置一个未对齐的.word,这将改变答案)。然后ldrb将返回0x01或0x04。取决于架构,执行时的模式和汇编程序。你作为程序员负责这三个。无法更改架构,但您知道正在运行哪一个,另外两个是100%程序员,直接或间接。

实验的后半部分当然是在硬件上运行程序,看看你得到了什么。