MOV, похоже, не работает - PullRequest
0 голосов
/ 06 мая 2018

Я пишу загрузчик для архитектуры 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 в эту область памяти, если не так?

...