Answer the question
In order to leave comments, you need to log in
How to set stack registers ss, sp on x86 (16bit loader)?
There is still a misunderstanding in setting the stack and data segments when writing the x86 bootloader in 16-bit mode.
I want a 1kb stack to be created after the 512-byte loader code.
There are two options:
[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 ;установка указателя стека
Answer the question
In order to leave comments, you need to log in
It is usually convenient to use a memory model in which all segment registers point to the same place. And if you write a bootloader, it is recommended to initialize the segment registers at the very beginning. Which segment value to choose - 0 or 0x7c0 does not make much difference. sp can be initialized like this:
start:
....
mov sp, start + 512 + 1024
org 0x7c00
start:
mov ax, 0
mov ss, ax
mov sp, start + 512 + 1024
mov ax, 0x060 ;(1024+512)/16=96=60h адрес стека после загрузчика в сегментах mov ss, ax ;установка адреса сегмента стека mov sp, 1024 ;установка указателя стека
add ax, 0x060 ;адрес стека после загрузчика в сегментах 0x07C0+0x060
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question