x86和内存寻址

8

我一直在阅读我拿到的汇编书中关于内存模型的内容,有一两个问题想请教。假设地址总线有32条线路,数据总线也有32条线路,CPU是32位的(为简单起见)。现在如果CPU进行读取请求并发送32位地址,但只需要8位,那么所有32位是否仍然会返回?此外,内存中的地址仍然按字节寻址,对吗?因此,获取一个字节将会把0000 0001带回到地址0000 0004吗?


1
地址为0000 0000至0000 0003,但你已经得到它了。 - Potatoswatter
问题是什么?行为mov 0,%al也会将ah清零,还是性能? - Ciro Santilli OurBigBook.com
1
@CiroSantilli新疆棉花TRUMPBANBAD:从绝对地址0加载到AL寄存器不会影响AH寄存器。(我认为您已经知道这一点,但是您之前的评论听起来有误导性,好像您在陈述它确实会影响AH寄存器,而不是仅仅询问OP是否是这个意思。) - Peter Cordes
你真的应该阅读这篇文章:程序员应该了解的有关内存的所有知识 - Paul R
1个回答

9
一般来说是这样的。从公交车上读取单词的部分是没有意义的,因此会读取整个单词。指令规定了需要实际加载或存储在寄存器中的单词部分。
尽管如此,在现代很少直接从内存中读取。CPU 有缓存,你99% 的时间都与它交互,当数据不在缓存中时,会带入整行(多个单词),然后再从缓存中读取。
此外,请注意许多现代 CPU 实际上具有64位总线。

你能推荐一些关于CPU架构、内存模型等方面的好书吗?谢谢! - IM.
不可缓存的MMIO读取确实需要通过总线发出信号,指示正在读取哪个特定字节。对于具有“前端”总线(而不是在芯片内部解决IO与DRAM),您会为32位总线中的每个4个字节设置字节启用线。像x86这样更复杂的总线直到K8 / Nehalem集成存储器控制器可能会以不同的方式进行不可缓存的加载或存储操作(例如带有标头的某种“消息”,而不是专用引脚)。我不知道。 - Peter Cordes

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