следующий код загрузчика:
Отсутствует информация о том, как будет установлен относительный адрес собранного кода, то есть как будут рассчитываться локальные смещения. Обычно загрузчики начинаются с org 0x7C00
, чтобы сделать это явным, код ожидает запуска на cs:ip = 0000:7C00
. Но если бы вы сделали это, ds=07C0
было бы неправильно, если предположить, что код ожидает, что смещения будут собраны, как если бы он начинался с 07C0:0000
вместо 0000:7C00
. В то время как оба адреса ориентированы на один и тот же адрес физической памяти, пары сегмент: смещение отличаются.
Каждый сегмент увеличивается в блоках по 16 байтов, поэтому 07C0h даст вам диапазон адресов 0x7C00-0x7C0F. Следующий сегмент 07C1h даст вам адрес 0x7C10-0x7C1F.
Каждый сегмент дает диапазон 64 кБ, хотя начальный адрес увеличивается только на 16 байт, поэтому между сегментами существует много совпадений, и вы можете адресовать один и тот же физический адрес многими комбинациями. То есть ds=07C0
дает вам окно в диапазон физической памяти 07C00-17BFF
.
Тогда ваши преобразования значений в шестнадцатеричные значения неправильны (см. Также комментарии Михаэля), 288 = 0x120 и 4096 = 0x1000, но вы правильно пришли к выводу, что есть 512B кода загрузчика (один сектор блочного устройства), 4096B свободного места, а затем 4096B стекового пространства. Если бы вы заполнили стек, вставив в него более 4096 байт, он не попадет в свободное место после кода, но обернется до 08E0:FFFE
(намного выше первоначального начала стека).
Я предполагаю, что он не будет последовательным, и ассемблер скомпилирует машинный код по-другому.
Напротив, инструкции и определенные байты в исходном коде выводятся последовательно в результирующий машинный код. Используйте переключатель командной строки «list», чтобы увидеть, как ассемблер генерирует машинный код для определенных строк. Если бы вы, например, переместили строку text_string db 'This is my cool new OS!', 0
в начале после директивы BITS 16
, этот текст был бы затем в начале машинного кода, загружался и выполнялся BIOS по адресу / из 0000:7C00
, выполняя текстовые байты в качестве инструкций .