Я пишу загрузчик для архитектуры x86. До сих пор я просто использовал 16-битный и использовал вызовы BIOS для таких вещей, как отображение символов, чтение диска и т. Д., Но теперь я хочу войти в 32-битный защищенный режим.
Я решил начать с того, что больше не использую функции BIOS, поскольку они работают только в 16-битном режиме.
Поскольку мой загрузчик будет загружен в 0x7c00
в памяти (поскольку сектор заканчивается на 0xaa55
, и , так как теперь я хочу работать в 32 битах, первые две строки в моем boot.asm
являются:
[org 0x7c00]
[bits 32]
Теперь, насколько я понимаю, текстовая видеопамять для BIOS начинается с 0xb8000
, поэтому для отображения символа в верхнем левом углу экрана - скажем, белого «А» на черном фоне - Я бы сделал это:
mov al, 'A'
mov ah, 0x0f ; white on black
mov [0xb8000], ax
Чтобы переместить персонажа с правильными атрибутами в начало видеопамяти. Затем я эмулировал свою операционную систему в bochs, но мой персонаж не был тем, кем я хотел быть. Я не мог видеть это.
Затем я подумал, что это может иметь какое-то отношение к моей директиве [org 0x7c00]
, которая, насколько я понимаю, компенсирует любые адреса, которые я использую. В результате этого будет иметь смысл, что вместо перемещения ax
на 0xb8000
я переместу его на 0xb8000 - 0x7c00 = 0xb0400
. Я заменил код на:
mov al, 'A'
mov ah, 0x0f
mov [0xb0400], ax
Но это было той же проблемой, что и последняя попытка (персонажа не было на экране или в правильном месте памяти). Я не могу придумать, что еще можно попробовать, и поиск интернета за какой-либо помощью, кажется, ничего не дает.
Почему это не работает? Как сделать переместить персонажа A
в эту область памяти, если не так?