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

Memory 如何为8086处理器编写大于64KB的程序?,memory,intel,x86-16,segment,Memory,Intel,X86 16,Segment,一段只有64KB长。因此,一个程序的最大大小必须为64KB,才能装入内存段(即,如果不改变段寄存器值) 假设我们想为8086系统编写一个大于64KB的程序。大概这需要在程序中间某处更改寄存器登记值吗?我们是在程序内部显式地更改它,还是只编写代码并让操作系统处理它?操作系统希望DOS如何处理如此大的程序?x86处理器有JMP和CALL的变体,您可以在其中为CS指定一个新值(代码段寄存器)。这被称为farJMP/CALL,不同的汇编程序的确切语法不同。如果我们以NASM为例,您会写道: ; Do a

一段只有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功能返回程序使用的除当前段以外的全部内存。

可能是16,然后是最后4个,有两个时钟周期?