В качестве учебного опыта я пишу загрузчик для BIOS в NASM в 16-битном реальном режиме в моем эмуляторе x86, Qemu.
BIOS загружает ваш загрузочный сектор по адресу 0x7C00
. NASM предполагает, что вы начинаете с 0x0
, поэтому ваши метки бесполезны, если вы не сделаете что-то вроде указания источника с помощью [org 0x7C00]
(или, предположительно, других методов). Но когда вы загружаете загрузчик 2-го этапа, его происхождение в ОЗУ другое, что чертовски усложняет использование меток в этом недавно загруженном коде.
Каков рекомендуемый способ справиться с этим? Это территория компоновщика? Должен ли я использовать сегментные регистры вместо org
?
Заранее спасибо!
p.s. Вот код, который работает прямо сейчас:
[bits 16]
[org 0x7c00]
LOAD_ADDR: equ 0x9000 ; This is where I'm loading the 2nd stage in RAM.
start:
mov bp, 0x8000 ; set up the stack
mov sp, bp ; relatively out of the way
call disk_load ; load the new instructions
; at 0x9000
jmp LOAD_ADDR
%include "disk_load.asm"
times 510 - ($ - $$) db 0
dw 0xaa55 ;; end of bootsector
seg_two:
;; this is ridiculous. Better way?
mov cx, LOAD_ADDR + print_j - seg_two
jmp cx
jmp $
print_j:
mov ah, 0x0E
mov al, 'k'
int 0x10
jmp $
times 2048 db 0xf