Какое значение следует использовать для SP для процесса загрузки?
=================================================================

Последовательность загрузки в BIOS загружает первую действительную MBR, которую он находит, в физическую память компьютера по адресу 0x7C00.

Какое значение следует использовать для SP для процесса загрузки?

`SS:SP` такой, что для вашего кода достаточно стекового пространства**AND** Служба обработки прерываний в порядке.

И, разумеется, ваш стек не должен вступать в конфликт с каким-либо кодом или другими данными или работать в ПЗУ или в диапазоне адресов отображаемого в памяти устройства.

BIOS не гарантирует, что`SS:SP` ваш загрузочный сектор получит. Так что, изменяя только`SP` не так.

Например, вы можете сделать это (если в этом месте нет вашего кода или данных):

Это установит`SS:SP` до 0: 0. Пока не паникуйте. Следующий толчок будет первым уменьшением`SP` от 0 до 0xFFFE и записать в 0: 0xFFFE, а не в 0: 0.

Это даст вам 0x10000 - (0x7c00 + 0x200) = 33280 байт пространства между концом загрузочного сектора и адресом указателя максимального стека. Это достаточно места в стеке.

Также обратите внимание, что при изменении обоих`SS` а также`SP`Вы должны сделать это с отключенными прерываниями или сначала изменить`SS` а затем изменить`SP` в сразу же следующей инструкции (как показано выше).

В качестве альтернативы вы можете использовать`LSS SP, ...` инструкции, но он принимает в качестве аргумента адрес дальнего адреса, то есть ваш новый`SS:SP` Значение сначала должно быть где-то в памяти.

Еще один способ изменить`SS` а также`SP` это использовать`PUSH` а также`RETF`.



0000: 0500 до 0007: FFFF гарантированно бесплатен для использования. Правильная инициализация выглядит так:

Я использую 7C00, стек идет вниз, а код идет вверх. Вы можете заменить 7C00 любым допустимым диапазоном, как упомянуто, только убедитесь, что не перезаписываете свой собственный код / данные.

Кстати, большинство MBR по традиции переместится в 0000: 0600, а VBR с цепной загрузкой - в 7C00.

Также обратите внимание на jmp .reloc, некоторые ошибочные BIOS запускают MBR с 07C0: 0000, поэтому в jmp убедитесь, что CS = 0