Assembly 端度对ARM内存负载的影响
在阅读我用C编写的代码反汇编时,我找到了Assembly 端度对ARM内存负载的影响,assembly,arm,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] 假设处理器处于little endian模式,r2的内容是什么?它是0x01还是20?如果我像下面那样使用.word汇编指令
.word
和.byte
指令,我想知道它们到底做了什么。如果我在ARM中有以下代码
some_data:
.byte 0x01, 0x02, 0x03, 20
我执行下面的代码
movw r1, #lower16:some_data
movt r1, #upper16:some_data
ldrb r2, [r1, #0]
假设处理器处于little endian模式,r2
的内容是什么?它是0x01
还是20
?如果我像下面那样使用.word
汇编指令会怎么样
some_data:
.word 0x01020304
对于LDRB指令,CPU端性并不重要。它总是读取给定地址的字节。对于
.word
示例,如果汇编器处于小端模式,则单词0x01020304的第一个字节是最低有效字节或0x04。对于LDRB指令,CPU端号无关紧要。它总是读取给定地址的字节。对于.word
示例,如果汇编器处于小端模式,则单词0x01020304的第一个字节是最低有效字节或0x04。这显然是RTM的问题。旧的armv6之前的arm是word不变量或现在arm所称的BE-32。armv6及更高版本是字节不变的。请参阅arm文档和汇编程序文档
你在这里问了两个问题,或者三个或更多
1) 您似乎对ldrb在两种模式下返回的内容感到好奇。Armv6和更高版本是字节不变的,因此这意味着无论您处于何种模式,同一字节指令(ldrb或strb)都以相同的方式对内存中的同一字节进行操作。armv4和armv5是单词不变的,这意味着单词操作(ldr、str、stm、ldm)的操作方式与endian设置无关。这意味着这些体系结构上的字节操作是受endianness影响的,事实上也是如此
2) 我的汇编程序如何处理.word或.byte,以及如何将其放入内存中。汇编语言是由您使用的软件汇编程序定义的。没有一个标准,即使有,也不意味着人们必须遵循它。如果您假设arm文档是标准的,那么为什么最流行的arm汇编程序不遵循它呢?汇编语言是由汇编程序定义的,那么您使用的汇编程序是什么,具体的版本是什么,具体的命令行选项或指令是什么,如果是基于源代码的,那么编译该工具时使用的选项是什么?除了说“试试看”之外,我们无法回答。如果不比在线提问花费更少的时间,当然,如果你加上等待答案的时间,那么所花费的时间也差不多
那么,s
然后试试看
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
arm none eabi as so.s-o so.o
arm none eabi objdump-D so.o
so.o:文件格式elf32 littlearm
第节的分解。正文:
00000000 :
0:14030201 strne r0,[r3],#-513;0xfffffdff
4:01020304 tsteq r2、r4、lsl#6
arm none eabi objcopy so.o-o binary so.bin
hextump-cso.bin
00000000 01 02 03 14 04 03 02 01 |........|
00000008
所以,对于我的汇编程序做什么这个问题,有很多可能的答案
3) 那么运行时会发生什么,这是真正的问题1,但你把这两个问题放在一起,我是如何汇编代码的,它是如何将数据放在内存中的,再加上我在特定指令的体系结构上处于什么模式
如果不写上面的任何内容,您的问题的答案是“这取决于”假设r1的命名法是在某些_数据(低两位零)的开头对齐地址,并且某些_数据在字边界上对齐。(尽管您认为所有arm体系结构都支持未对齐的访问,但它们的支持方式不同,具体取决于体系结构ldrb不是未对齐的,但工具可能不关心、取决于并放置一个未对齐的.word,这将改变答案)。然后ldrb将返回0x01或0x04。取决于体系结构、执行时的模式和汇编程序。作为程序员,您要对这三个方面负责。不能改变架构,但你知道你正在运行哪一个,另外两个是100%的程序员,直接或间接
当然,实验的后半部分是在硬件上运行程序,看看你得到了什么。这显然是RTM的事情。旧的armv6之前的arm是word不变量或现在arm所称的BE-32。armv6及更高版本是字节不变的。请参阅arm文档和汇编程序文档 你在这里问了两个问题,或者三个或更多 1) 您似乎对ldrb在两种模式下返回的内容感到好奇。Armv6和更高版本是字节不变的,因此这意味着无论您处于何种模式,同一字节指令(ldrb或strb)都以相同的方式对内存中的同一字节进行操作。armv4和armv5是单词不变的,这意味着单词操作(ldr、str、stm、ldm)的操作方式与endian设置无关。这意味着这些体系结构上的字节操作是受endianness影响的,事实上也是如此 2) 我的汇编程序如何处理.word或.byte,以及如何将其放入内存中。汇编语言是由您使用的软件汇编程序定义的。没有一个标准,即使有,也不意味着人们必须遵循它。如果您假设arm文档是标准的,那么为什么最流行的arm汇编程序不遵循它呢?汇编语言是由汇编程序定义的,那么您使用的汇编程序是什么,具体的版本是什么,具体的命令行选项或指令是什么,如果是基于源代码的,那么编译该工具时使用的选项是什么?除了说“试试看”之外,我们无法回答。如果不比在线提问花费更少的时间,当然,如果你加上等待答案的时间,那么所花费的时间也差不多 那么,s 然后试试看
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
arm none eabi as so.s-o so.o
arm none eabi objdump-D so.o
so.o:fo文件