Как писать программы размером более 64 КБ для процессора 8086?

Сегмент имеет длину всего 64 КБ. поэтому программа должна иметь размер не более 64 КБ, чтобы поместиться в сегмент памяти (т. Е. Если значение регистра сегмента не должно изменяться).

Предположим, мы хотим написать программу размером более 64 КБ для системы 8086. Предположительно для этого потребуется изменить значение сегментного регистра где-то в середине программы? Изменяем ли мы его явно внутри программы или просто пишем код и позволяем ОС обработать его? Как операционная система, такая как DOS, справится с такой большой программой?


person KawaiKx    schedule 17.10.2013    source источник
comment
Может быть, он получает 16, а затем последние 4 с двумя тактами?   -  person Leonardo    schedule 17.10.2013


Ответы (2)


Процессоры 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 находится в другом сегменте, хотя я не могу назвать никаких примеров, так как это не то, что я тестировал.

person Michael    schedule 18.10.2013

Если ваша программа будет скомпилирована в файл .com, размер вашего кода не может превышать ~63 КБ. Если вы хотите добавить код, вы должны записать этот код в отдельный файл и загрузить код из файла во время выполнения. Для создания массивов или добавления кода или данных вне сегмента, в который был загружен файл .com, ваша программа должна зарезервировать свободную память. Для этого используйте функцию DOS для резервирования свободного места. Прежде чем сделать это, используйте функцию DOS, чтобы вернуть всю память, используемую вашей программой, за исключением текущего сегмента.

person Van Uitkon    schedule 04.12.2014