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

13

我很清楚32位或64位系统的含义,所有寄存器或字长都是32位或64位。

为了简单起见,我们以32位系统为例,并假设我正在用C语言编写程序。如果我声明一个int类型变量,比如 "int a = 5;",那么一个字长的内存位置就被保留给变量a。因此,每当我想要访问它时,我可以使用该内存位置的字地址。

但是,假设我有4个字符 "char a,b,c,d;",由于每个字符只占用一个字节,它们都被放置在一个字中,那么如果我想要访问仅字符b怎么办?(假设内存可按字节寻址)现在假设b是字中的第三个字节...那么它如何进入总线?第3个字节不是与总线上的第17到24个线路硬连在一起吗?那么当仅访问b时其他24条线路会发生什么?


请检查特定CPU的机器语言和汇编语言,尤其是与内存寻址和CPU寄存器相关的部分。 - theglauber
1
@deepak,在支持字节寻址的32位平台上,可以在不写入其他三个字节(通过关闭字节使能信号)的情况下向内存写入单个字节。 - Eric Z
@EricZ,如果我想要的字节是内存中的第二个字节(从零开始计数),会发生什么情况?通常,当我从内存中访问一个字时,第二个字节会落在寄存器的位23-16之间。但在这种情况下,它将不得不落在位置7-0。这让我感到困惑,因为我认为内存中的位0是有线连接到寄存器的位0上的,位31也是如此。我以为这都是电路设计好的,那么在字节访问期间,应该在位16处着陆的位,怎么会落到位0呢? - deepak
2
@deepak,CPU可以从内存中读取4个字节,并将其他3个字节移开以生成第二个字节。这只是在底层发生的事情,在汇编中甚至看不到。 - Eric Z
2个回答

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

终于我明白了如何存储小于一个字的变量的逻辑,非常感谢。 - HKIT

3

这取决于汇编程序,它可以选择分配一个字的内存或一个字节的内存。
因此,即使单词中包含4个不同的字符,现在发生的是它们都一次性被访问,但只有你需要的那个会被处理。也就是说,所有字符都从内存中进入处理器,然后只考虑你需要的字节,其他字节会被拒绝。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接