微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果我们在内存地址末尾请求多字节数据会发生什么?

如何解决如果我们在内存地址末尾请求多字节数据会发生什么?

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

解决方法

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

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

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

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

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

至于尝试读取不存在的物理内存地址的值是多少,这取决于硬件。如果您尝试使用 32 位地址读取值,但硬件只有 24 个地址位,那么其中一些较大的逻辑地址将“环绕”并从较低地址的物理内存中读取(因为较高的地址位有效由于没有地址线来保持它们而被掩盖)。或者,您可能会得到 0、0xFF 或一些碰巧浮动在数据线上的不确定值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。