1

一个段只有 64KB 长。所以程序的大小必须最大为 64KB 才能放入内存段(即,如果段寄存器值不更改)。

假设我们要为 8086 系统编写一个大于 64KB 的程序。大概这将需要在程序中间某处更改段寄存器值?我们是在程序内部显式更改它,还是我们只编写代码并让操作系统处理它?像 DOS 这样的操作系统如何处理这么大的程序?

4

2 回答 2

1

x86 处理器具有变体JMP,您可以在其中为(代码段寄存器)CALL指定新值。CS这被称为far JMP/CALL,不同的汇编程序之间的确切语法不同。如果我们以 NASM 为例,你会写:

; Do an inter-segment jump to the label named foobar
jmp (seg foobar):foobar

; Do an inter-segment call to the subroutine named foobar
call (seg foobar):foobar

即使您刚刚编写jmp foobar并且foobar位于不同的段中,也可能有足够聪明的汇编程序来计算产生远跳,尽管我无法命名任何示例,因为这不是我测试过的东西。

于 2013-10-18T08:19:00.607 回答
1

如果您的程序将被编译为 .com 文件,则您的代码不能大于 ~63 KB。如果要添加代码,则必须将该代码写入单独的文件并在运行时从文件中加载代码。要在已加载 .com 文件的段之外创建数组或添加代码或数据,您的程序必须保留可用内存。为此,请使用 DOS 功能来保留可用空间。在执行此操作之前,请使用 DOS 函数归还程序使用的整个内存,但当前段除外。

于 2014-12-04T18:14:54.820 回答