16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址

How a program in 16 bit system can access integers more than 65535 but not address

本文关键字:访问 大于 65535 整数 地址 但不能 系统 程序 何访问      更新时间:2023-10-16

一个16位系统只能访问最多64KB的RAM(正常情况下(。内存地址的概念是 16 位系统可以访问 2^16 个数字,因此在无符号整数中,它只能访问 2^16 = 65536 个整数(0 到 65535(。因此,16位系统只能使用最大64KB的地址(在小计算结束后(。现在主要的 QUE。当我们定义一个整数为"long int"时,它如何访问大于 65535 的整数?

这篇文章中有很多误解:

我在前几天才知道 16 位系统最多只能访问 64KB 的 RAM

这实际上是错误的,8086 具有 20 位的外部地址总线,因此它可以访问 1,048,576 字节 (~1MB(。您可以在此处阅读有关 8086 架构的更多信息:https://en.wikipedia.org/wiki/Intel_8086。

当我们定义一个整数为"long int"时,它如何访问大于 65535 的整数?

您是在问寄存器大小吗?在这种情况下,答案很简单:它没有。它可以访问前 16 位,然后可以访问其他 16 位,无论应用程序对这 2 个 16 位值做什么,都取决于它(以及使用的框架,如 C 运行时(。

至于如何仅使用16位整数访问20位的完整地址空间,答案是地址分段。您有第二个寄存器(8086 上的 CS、DS、SS、ES 和 ES(,用于存储地址的高部分,CPU 将它们"拼接"在一起以发送到内存控制器。

计算机可以对大于机器字的值执行算术,就像人类对大于数字的值执行算术一样:通过将操作拆分为多个部分,并跟踪将在它们之间移动数据的"携带"。

例如,在 8086 上,如果 AX 保存 32 位数字的下半部分,DX 保存上半部分,则序列:

ADD AX,[someValue]
ADC DX,[someValue+2]

将向 DX::AX 添加 32 位值,该值的下半部分位于地址 [someValue],上半部分位于 [someValue+2]。 ADD 指令将更新一个"进位"标志,指示是否有从添加中执行,如果设置了进位标志,ADC 指令将添加额外的 1。

某些处理器没有进位标志,但有一个指令将比较两个寄存器,如果第一个寄存器大于第二个寄存器,则将第三个寄存器设置为 1,否则设置为 0。 在这些处理器上,如果要将 R1::R0 添加到 R3::R2 并将结果放在 R5::R4 中,可以使用以下序列:

Add R0 to R2 and store the result in R4
Set R5 to 1 if R4 is less than R0 (will happen if there was a carry), and 0 otherwise
Add R1 to R5, storing the result in R5
Add R3 to R5, storing the result in R5

比普通的单字加法慢四倍,但至少仍然有些实用。 请注意,虽然携带标志方法很容易扩展以对任何大小的数字进行操作,但将此方法扩展到两个单词以上要困难得多。