c - 使用 FreeDOS 是否允许我的程序访问超过 64 K 的内存?

标签 c assembly dos x86-16 memory-limit

我对 FreeDOS 上的 C 语言编程很感兴趣,同时在这个过程中学习了一些基本的 ASM,使用 FreeDOS 会让我的程序访问超过标准 640K 的内存吗?

其次,关于 ASM,我知道由于 CPU 架构的复杂性,在现代处理器上很难进行汇编编程,但是使用 FreeDOS 是否会限制我使用可能更简单的 16 位指令集?

最佳答案

MS-DOS 和 FreeDOS 使用“HIMEM”区域:这些是:

  • 0xA000:0x0000以上的一些内存区域保留给包含RAM而不是扩展卡的扩展卡
  • 从 0xFFFF:0x0010 到 0xFFFF:0xFFFF 之间的内存,位于 1MB 以上,但可以使用 16 位实模式代码访问(如果所谓的 A20 线处于事件状态)。

通过这种方式可以归档的最大内存大小约为 800K。

使用XMS和EMS您最多可以使用64M:

  • XMS 将在可通过 16 位实模式代码访问的区域之上分配内存块。有一些特殊的函数可以将数据从该内存复制到低 640K 内存,反之亦然
  • EMS类似;然而,使用 EMS 可以将高位内存“映射”到低位地址(32 位 CPU 的一项功能),这意味着您可以访问 1MB 区域以上的某些内存,就像它位于 1MB 以下的地址一样。

关于c - 使用 FreeDOS 是否允许我的程序访问超过 64 K 的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20343282/

相关文章:

c - UDP 客户端没有从 C 中的服务器接收任何内容

c - 使用 strtok 时如何跳过输入文件中的空白行?

assembly - 是否有为z/assembler量身定制的emacs组织模式的变体?

time - (MS-DOS) 时间延迟

assembly - 使用 $ 符号为上一行中存在的变量赋值

c - C 中的字符串和 strcpy

c - 如果 linux 安装在 usb 上,如何在 Linux 中运行 c 代码

assembly - x86 ASM : useless conditional jump?

c - 将 C 字符串转换为所有一种情况处理器的最快方法

java - Dos命令获取IE页面源