如何为8086处理器编写大于64KB的程序?

时间:2013-10-17 08:19:19

标签: memory intel x86-16 segment

一个段只有64KB长。因此,程序的大小必须最大为64KB才能适合存储器段(即,如果不改变段寄存器值)。

假设我们要为8086系统编写一个大于64KB的程序。据推测,这需要在程序中间某处更改段寄存器值?我们是否在程序中明确地更改它,或者我们只是编写代码并让操作系统处理它? DOS之类的操作系统如何处理这样大的程序?

2 个答案:

答案 0 :(得分:1)

x86处理器具有JMPCALL的变体,您可以在其中为CS(代码段寄存器)指定新值。这称为 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位于不同的段中,也可能存在足够聪明的装配工以确定产生远跳,但我不能说出任何例子因为这不是我测试的东西。

答案 1 :(得分:1)

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