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

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

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

org 7c00h      ; set location counter.
mov ax, XXX    ; What is XXX?
mov sp, ax
; Now PUSH an POP are safe

Ответы на вопрос(2)

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

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

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

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

...
mov ax, 0
mov ss, ax
mov sp, ax
...

Это установит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 гарантированно бесплатен для использования. Правильная инициализация выглядит так:

org 0x0600
...

cli
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7C00

; relocate itself
mov si, sp
mov di, 0x0600
mov cx, 256
rep movsw

; make sure we'are at 0000:0600+x
jmp 0:.reloc
.reloc:
push 2
popf    ; flags with all off

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

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

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

ВАШ ОТВЕТ НА ВОПРОС