Следующие исходные файлы собираются отдельно (в исходные двоичные файлы) и загружаются соответственно в сектора 1 и 2 виртуальной дискеты. Затем эта дискета служит загрузочным носителем для виртуальной машины qemu-system-i386.Независимый от положения код в 16-разрядном реальном режиме, загрузочная/гибкая запись
«загрузчик» считывает «первую программу» из сектора 2 дискеты, а затем переходит в память, содержащую только что прочитанный код. Следующий код работает по желанию (т. Е. Печатается приветственное сообщение «первая программа»), но мне нужно указать ORG 0x001E
в источнике «первой программы» (полученный путем изучения кода загрузчика в шестнадцатеричном редакторе). 0x001E - это смещение буфера temp
, в котором содержится код, считываемый с дискеты.
"Загрузчик":
BITS 16
bootloader_main:
mov bx, 0x07C0 ; Set data segment to bootloader's default segment
mov ds, bx
mov ah, 0x02 ; BIOS int13h "read sector" function
mov al, 1 ; Number of sectors to read
mov cl, 2 ; Sector to read
mov ch, 0 ; Cylinder/track
mov dh, 0 ; Head
mov dl, 0 ; Disk number (here, the floppy disk)
mov bx, 0x07C0 ; Segment containing the destination buffer
mov es, bx
mov bx, temp ; Destination buffer offset
int 0x13
jmp temp
ret
;end bootloader_main
temp: times 60 db 17
times 510-($-$$) db 0 ; Pad rest of sector and add bootloader
dw 0xAA55 signature
"первая программа":
BITS 16
ORG 0x001E ; Assume that this code will be located 0x001E bytes
after start of bootloader (in RAM)
mov bx, string ; Print a welcome string
mov ah, 0x0E
print_loop:
mov al, byte [bx]
int 0x10
inc bx
cmp byte [bx], 0
jne print_loop
;end print_loop
string: db "This is the first program.", 0
С другой стороны, я мог бы использовать ORG 0x200
и 0x200
для буфера вместо temp
(т.е. загрузить программу в оперативную память только после того, как загрузчик), но ни один из этих хаков не кажется устойчивым, когда речь заходит о создании полезных операционных систем. Как избежать такого рода жесткого кодирования адресов?
Пожалуйста Тэг архитектуры процессора при размещении сборки вопросов. – rjp
Я бы предположил, что базовый адрес - это то, что нужно указать с помощью загрузчика. Большая часть моей работы в этой области была на встроенных системах, и я знаю, что BIOS делает много всего для вас. Для меня, когда я использую загрузчик, у него обычно есть документация, сообщающая мне, где ожидается точка входа. – rjp
Итак, если кто-то собирал программу, которая будет загружена на дискету и прочитана загрузчиком, им будет предложено добавить в свой код код ORG 512 (или какой-либо другой определенный адрес)? И загрузчик всегда будет загружать программу в ту же часть памяти? Трудно представить себе, как из этого сложились современные операционные системы, но я думаю, мне следует больше узнать об истории. – Vale132