16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
How a program in 16 bit system can access integers more than 65535 but not address
一个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
比普通的单字加法慢四倍,但至少仍然有些实用。 请注意,虽然携带标志方法很容易扩展以对任何大小的数字进行操作,但将此方法扩展到两个单词以上要困难得多。
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从C++dll访问C#中的一行主要参数
- 大于65535的C++数组[size]引发不一致的溢出
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 查找最接近的大于当前数字的数字的索引
- 16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
- 向量下标出的范围错误.即使向量的索引大于访问数据的索引,也会发生误差
- 访问 std::string 中的元素,其中字符串的位置大于其大小
- 能够访问索引大于数组长度的元素