一个段只有64KB长。因此,程序的大小必须最大为64KB才能适合存储器段(即,如果不改变段寄存器值)。
假设我们要为8086系统编写一个大于64KB的程序。据推测,这需要在程序中间某处更改段寄存器值?我们是否在程序中明确地更改它,或者我们只是编写代码并让操作系统处理它? DOS之类的操作系统如何处理这样大的程序?
答案 0 :(得分:1)
x86处理器具有JMP
和CALL
的变体,您可以在其中为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函数返回程序使用的整个内存(当前段除外)。