如果我们请求内存地址末尾的多字节数据会怎样?

What happens if we request multibyte data at the end of memory address?

我正在学习汇编语言,对此有疑问。 我有一个实模式的引导加载程序,我们可以在其中访问高达 1 MB 的内存。如果我们在 1 mb space 的末尾位置请求 2 字节数据,会发生什么情况,它会 return 只有一个字节还是引发一些异常? 当我们处于保护模式(启用和禁用分页)时,我有类似的问题。 另一个问题是当一个程序试图访问比裸机非分页环境中物理安装的内存更多的地址时会发生什么? (说在2gb的机器上访问地址0x00FFFFFF,这里的地址是2gb多) 我已经阅读了 Intel 手册的某些部分,但是它们很庞大,很难找到这些信息。

效果取决于很多因素,包括您的 CPU、其他硬件以及您尝试访问最后一个字节的方式。

在原始的 8086 上,访问最后一个字节会回到内存的开头。

在支持超过 1MB 内存的 CPU 之后(如 80286),访问最后一个字节可能会触发错误(如果尝试访问实模式地址 0xF000:FFFF作为 16 位字),或(取决于系统的 A20 地址线是否启用)回绕以访问物理地址 0 或读取存储在物理地址 0x100000(1MB)中的字节。这可以通过尝试将地址 0xFFFF:000F 读取为一个单词来完成。

随着 80386 大大扩展的保护模式,还有其他可能的考虑因素(比如被寻址的段是否足够大以容纳地址),但最终归结为要么你读字要么你会得到一个例外。

总而言之,您要么读取两个字节,要么得到一个异常。您不会得到部分阅读。

就您尝试读取不存在的物理内存地址所获得的价值而言,这取决于硬件。如果您尝试使用 32 位地址读取一个值,但硬件只有 24 个地址位,那么其中一些较大的逻辑地址将“环绕”并从较低地址的物理内存中读取(因为较高的地址位实际上是由于没有地址线来保存它们而被掩盖了)。或者您可以取回 0、0xFF,或者可能是恰好浮动在数据线上的不确定值。