在阅读我在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
答案 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%程序员,直接或间接。
实验的后半部分当然是在硬件上运行程序,看看你得到了什么。