当前位置: 首页 > 知识库问答 >
问题:

64位计算机如何更改内存中的一个字节?[重复]

白刚洁
2023-03-14

如果一个C程序改变字节数组中的一个字节,会发生什么机器指令?硬件是否需要读取8个字节、更改一个字节并存储它(使用2个内存操作)?

编辑:特别是在x86-64体系结构上

共有2个答案

阴迪
2023-03-14

这完全取决于编译器、优化等。只需尝试编译和反汇编即可。作为示例,我们将编译以下代码:

#include <stdio.h>

int main() {
    char a[] = "01234567890";
    a[5] = 'A';
    printf("%s\n", a);
}

// gcc -o main -std=c11 -Wall -Wextra -O0 main.c 

我们通过objdump获得分解:

 6c1:   48 b8 30 31 32 33 34    movabs rax,0x3736353433323130
 6c8:   35 36 37 
 6cb:   48 89 45 ec             mov    QWORD PTR [rbp-0x14],rax
 6cf:   c7 45 f4 38 39 30 00    mov    DWORD PTR [rbp-0xc],0x303938
 6d6:   c6 45 f1 41             mov    BYTE PTR [rbp-0xf],0x41
 6da:   48 8d 45 ec             lea    rax,[rbp-0x14]
 6de:   48 89 c7                mov    rdi,rax

// objdump -d ./main -Mintel | less
戚俊人
2023-03-14

在x86-64上,硬件将读取一条缓存线,修改缓存中的字节,最终该缓存线将写回内存。

发生回写的主要原因是CPU需要其他数据的缓存行。有明确的指令可以强制回写,但C编译器不太可能使用这些指令。它会减慢CPU以强制不必要的写入。

 类似资料:
  • 问题内容: 我想知道x86和x64中的64位长吗? 问题答案: 是。Java 在任何JVM上都是64位,无一例外。所有Java原语类型都是完全可移植的,并且在所有实现中都具有固定的大小。

  • 我有个奇怪的MSI!!!

  • 嗯,我可以通过逻辑做到这一点,但我打赌有一个数学运算或表达式来做到这一点。一个存在吗?如果是,是什么? 以下是算法: 长位置=位位置/64 接下来是:当2的次方时,如何将除法转换为按位移位?

  • 因此,我一直在寻找一个函数,该函数需要2个参数,一个低值和一个高值(均为64位整数),而不是在这些范围之间生成一个随机数。我一直遇到的问题是,这个数字不是64位int,或者边缘的数字比中间的数字更常见。 这是一些代码:它只是一直返回-1或0…

  • 问题内容: 是否可以在64位linux机器上使用Android SDK进行开发。可用的SDK下载似乎仅适用于32位版本的Linux。 问题答案: 是的。您需要安装ia32库。请查看Ubuntu Linux故障排除部分 。

  • 问题内容: 在64位计算机上,Java中的int大小是32位还是64位? 问题答案: 32位。这是Java语言的功能之一,整数的大小不会随基础计算机而变化。请参阅规范的相关部分。