Осталось недопонимание в задании сегментов стека и данных при написании загрузчика x86 в 16 битном режиме.
Хочу, чтобы стек размером 1кбайт создавался после кода загрузчика в 512 байт.
Есть два варианта:
[bits 16]
[org 0x7c00]
mov ax, 0x060 ;(1024+512)/16=96=60h адрес стека после загрузчика в сегментах
mov ss, ax ;установка адреса сегмента стека
mov sp, 1024 ;установка указателя стека
mov ax, 0x0000
mov ds, ax ;указатель равен 0, потому что смещение не нужно для меток. Все метки благодаря org 0x7c00 будут иметь правильный адрес
Либо:
[bits 16]
[org 0x0000]
mov ax, 0x07C0 ;0x7c00/0x10=0x07c0
mov ds, ax ;указатель сегмента данных равен 0x07c0. Все адреса меток в коде идут с 0, а код на самом деле перемещается на 0x7c00, поэтому нужно смещение
add ax, 0x060 ;адрес стека после загрузчика в сегментах 0x07C0+0x060
mov ss, ax ;установка адреса сегмента стека
mov sp, 1024 ;установка указателя стека
Насколько я понимаю, то адреса сегментов данных установлены правильно. Код без стека работает, как на виртуальной машине, так и на реальном ПК. В коде осуществляется правильный переход по меткам. Но вот со стеком возникают проблемы, вероятно, в варианте org 0x7c00, что то не так. Объясните, пожалуйста, где я совершаю ошибку.