为什么说32位CPU的寻址能力是4GB啊,不应该是64GB吗?

liuyufeng2 2011-10-23 08:51:07
王爽那本汇编上写的CPU寻址是段地址左移4位+偏移地址啊,那32位CPU左移4位就是36位,寻址能力不是应该是64GB吗?为什么说32位CPU内存只能插4GB就最大了?
...全文
838 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
良少 2011-10-24
  • 打赏
  • 举报
回复
段地址早就不用了。那是实模式下的寻址方式,而且实模式的寻址长度是20bit.
线性地址是32bit,就是2的32次方。
AnYidan 2011-10-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 only_lonely 的回复:]

寻址方式不一样,你说的那是16位的实模式。之所以存在段地址+偏移的寻址方式,那是因为8086地址总线有20位,而寄存器才16位。这是一种妥协,不得不采取的方式。

在保护模式下,是采用直接寻址的,也就是2的32次方,总共4GB的byte。


机器寄存器的位长是固定,但起所能寻址的范围更具其的寻址方式不同而不同。虽然寄存器,地址总线在硬件上限制了一次能够寻址的最大地址,但通过软件的模拟……
[/Quote]

++
mymsdndownload 2011-10-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 liuyufeng2 的回复:]
王爽那本汇编上写的CPU寻址是段地址左移4位+偏移地址啊,那32位CPU左移4位就是36位,寻址能力不是应该是64GB吗?为什么说32位CPU内存只能插4GB就最大了?
[/Quote]
数死早
Vincent_Song 2011-10-23
  • 打赏
  • 举报
回复 1
CPU的位数就是通用寄存器的位数,32CPU的通用寄存器位数就是32位。

16位CPU的通用寄存器位数是16位,地址总线是20位,寻址能力是1M,通用寄存器无法将20位的地址放入16位的寄存器中进行各种运算以及控制,所以要使用分段的方法,所以计算物理地址的时候是需要在地址加法器中进行将寄存器中的16位地址进行移位最后相加计算得出实际物理地址。

现在的CPU基本上保持了寄存器和地址总线位数的一致,所以一般情况下就不用在那么麻烦的分段计算了。

希望能够帮到你!
yujie_v 2011-10-23
  • 打赏
  • 举报
回复
20位地址总线才会偏移寻址的。
ProgrammingRing 2011-10-23
  • 打赏
  • 举报
回复
学习了
baihacker 2011-10-23
  • 打赏
  • 举报
回复
在现在,桌面使用的CPU中,地址总线是36位,理论上是64GB。
32位CPU中的32位是指处理数据的宽度。
在32位的工作模式下,一系列的软硬件上的原因导致只能使用4GB的内存。

对于民用而言:
win7 64位旗舰版,貌似是支持192G的内存。
而主板上能插多少呢?i7,3通道,每个通道8G,24G。

因此决定支持多少内存和很多因素有关。
only_lonely 2011-10-23
  • 打赏
  • 举报
回复
寻址方式不一样,你说的那是16位的实模式。之所以存在段地址+偏移的寻址方式,那是因为8086地址总线有20位,而寄存器才16位。这是一种妥协,不得不采取的方式。

在保护模式下,是采用直接寻址的,也就是2的32次方,总共4GB的byte。


机器寄存器的位长是固定,但起所能寻址的范围更具其的寻址方式不同而不同。虽然寄存器,地址总线在硬件上限制了一次能够寻址的最大地址,但通过软件的模拟与转换,还是能够突破此种限制的。

所谓的32位cpu内存最大只有4GB,只是一种通俗的说法,表明如果不加任何干预,32位计算机硬件在保护模式下最多能够寻址到4gb的地址空间范围。
东风异客 2011-10-23
  • 打赏
  • 举报
回复
cpu寻址不是只与地址总线的宽度有关吗 2的32次方字节是4GB啊
WIN32 程序运行在保护模式下的,保护模式的历史可以追溯到 80286。而今 80286 已成为了历史。所以我们将只把精力集中于 80386 及后续的X86 系列 CPU。Windows 把每一个 Win32 应用程序放到分开的虚拟地址空间中去运行,也就是每一个应用程序都拥有其相互独立的 4GB 地址空间,当然这倒不是它们都拥有 4GB 的物理地址空间,而只是能够在 4GB 的范围内寻址。操作系统将会在应用程序运行时完成 4GB 的虚拟地址和物理内存地址间的转换。这就要求编写应用程序时必须格守 Windows 的规范,否则极易引起内存的保护模式错误。而过去的 Win16 内存模式下,所有的应用程序都运行于同一个 4GB 地址空间,它们可以彼此"看"到别的程序的内容,这极易导致一个应用程序破坏另一个应用程序甚至是操作系统的数据或代码。 和 16 位 Windows 下的把代码分成 DATA,CODE 等段的内存模式不同,WIN32 只有一种内存模式,即 FLAT 模式,意思是"平坦"的内存模式,再没有 64K 的段大小限制,所有的 WIN32 的应用程序运行在一个连续、平坦、巨大的 4GB 的空间中。这同时也意味着您无须和段寄存器打交道,您可以用任意的段寄存器寻址任意的地址空间,这对于程序员来是非常方便的,这也使得用32位汇编语言和用C语言一样方便。 在Win32下编程,有许多重要的规则需要遵守。有一条很重要的是:Windows 在内部频繁使用 ESI,EDI,EBP,EBX 寄存器,而且并不去检测这些寄存器的值是否被更改,这样当您要使用这些寄存器时必须先保存它们的值,待用完后再恢复它们,一个最显著的应用例子就是 Windows 的 CallBack 函数中。
WIN32 程序运行在保护模式下的,保护模式的历史可以追溯到 80286。而今 80286 已成为了历史。所以我们将只把精力集中于 80386 及后续的X86 系列 CPU。Windows 把每一个 Win32 应用程序放到分开的虚拟地址空间中去运行,也就是每一个应用程序都拥有其相互独立的 4GB 地址空间,当然这倒不是它们都拥有 4GB 的物理地址空间,而只是能够在 4GB 的范围内寻址。操作系统将会在应用程序运行时完成 4GB 的虚拟地址和物理内存地址间的转换。这就要求编写应用程序时必须格守 Windows 的规范,否则极易引起内存的保护模式错误。而过去的 Win16 内存模式下,所有的应用程序都运行于同一个 4GB 地址空间,它们可以彼此"看"到别的程序的内容,这极易导致一个应用程序破坏另一个应用程序甚至是操作系统的数据或代码。 和 16 位 Windows 下的把代码分成 DATA,CODE 等段的内存模式不同,WIN32 只有一种内存模式,即 FLAT 模式,意思是"平坦"的内存模式,再没有 64K 的段大小限制,所有的 WIN32 的应用程序运行在一个连续、平坦、巨大的 4GB 的空间中。这同时也意味着您无须和段寄存器打交道,您可以用任意的段寄存器寻址任意的地址空间,这对于程序员来是非常方便的,这也使得用32位汇编语言和用C语言一样方便。 在Win32下编程,有许多重要的规则需要遵守。有一条很重要的是:Windows 在内部频繁使用 ESI,EDI,EBP,EBX 寄存器,而且并不去检测这些寄存器的值是否被更改,这样当您要使用这些寄存器时必须先保存它们的值,待用完后再恢复它们,一个最显著的应用例子就是 Windows 的 CallBack 函数中。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧