Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 端度对ARM内存负载的影响_Assembly_Arm - Fatal编程技术网

Assembly 端度对ARM内存负载的影响

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汇编指令

在阅读我用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
汇编指令会怎么样

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文件