如何在32位内存和32位处理器中访问单个字节的内存

时间:2012-09-18 15:41:40

标签: variables architecture bus

我完全理解32或64位系统的含义。所以基本上所有寄存器或字长都是32位或64位。

为了简单起见,让我们采用一个32位系统并说我在C中编写一个程序,如果我声明一个int类型说“int a = 5;”然后为var a保留一个字长的存储位置。因此,当我想要访问它时,我可以使用字地址为该内存位置。

但是说我有4个字符“char a,b,c,d;”因为它是一个字节,每个都放在一个字中,所以如果我只想访问char b,我该怎么办?(说内存是字节可寻址的)现在说b是字中的第三个字节...那怎么来公共汽车?总线的第3个字节硬连接到第17到第24行?那么当只有b被访问时,其他24行会发生什么?

2 个答案:

答案 0 :(得分:3)

您的问题的答案在很大程度上取决于您使用的编译器以及CPU,内存控制器和内存架构(缓存和外部存储器)的内部工作方式。
您只能控制编译器(假设您使用的是C或C ++编译器)。当您使用小于字大小的变量时,编译器具有不同的模式。有速度优化和内存优化的标志。根据打开哪些标志,编译器可以选择生成将所有四个变量(在您的情况下)打包成一个单词的代码。或者编译器可以选择为每个变量分配一个存储器字,但使用特定的字节来存储实际值。编译器为每种情况执行此操作的方式是为CPU生成不同的指令集。在后一种情况下,如果从存储器读取变量,则将整个字放在总线上,然后放入通用寄存器。在前一种情况下,字被放入寄存器,但随后字可以按位移位,其他位可以通过逻辑AND操作清零。这样,正确的字节就会出现在寄存器中。或者可能是CPU架构支持字中的字节级访问,在这种情况下,它只是CPU执行的一个操作。 最后,理解内部发生的事情是个好主意,但你不会太在意,因为编译器生成的指令集将从你的角度正确运行。您唯一需要关心的是编写性能敏感软件。在这种情况下,您需要了解CPU和内存的详细信息以及编译器支持的标志。

答案 1 :(得分:3)

它取决于汇编程序,它可以选择给出一个字的内存或一个字节。
所以现在即使你在单词中有4个不同的字符,会发生什么是一次性访问所有字符,但只有你需要的字符被操作。即所有这些都从内存进入处理器,然后只考虑你想要的字节,其他的被拒绝。