一个段只有 64KB 长。所以程序的大小必须最大为 64KB 才能放入内存段(即,如果段寄存器值不更改)。
假设我们要为 8086 系统编写一个大于 64KB 的程序。大概这将需要在程序中间某处更改段寄存器值?我们是在程序内部显式更改它,还是我们只编写代码并让操作系统处理它?像 DOS 这样的操作系统如何处理这么大的程序?
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
位于不同的段中,也可能有足够聪明的汇编程序来计算产生远跳,尽管我无法命名任何示例,因为这不是我测试过的东西。
如果您的程序将被编译为 .com 文件,则您的代码不能大于 ~63 KB。如果要添加代码,则必须将该代码写入单独的文件并在运行时从文件中加载代码。要在已加载 .com 文件的段之外创建数组或添加代码或数据,您的程序必须保留可用内存。为此,请使用 DOS 功能来保留可用空间。在执行此操作之前,请使用 DOS 函数归还程序使用的整个内存,但当前段除外。