2010-06-02 4 views
0

Я решил написать свой собственный загрузчик.Влияние CLI на видеопамять

Мне удалось установить видеорежим на 3 (хотя qemu уже устанавливает его на 3 уже), а затем распечатать «A» у первого символа первой строки на экране, напрямую меняя видеопамять.

[org 0x7C00] ;Address BIOS loads the bootloader into 
[bits 16] 

;Set video mode to mode 3 
mov al, 0x03 
mov ah, 0x00 
int 0x10 

mov ax, 0xB800 
mov es, ax 
mov bx, 0 
mov [es:bx], byte 65 
mov [es:bx+1], byte 0x0F 

;cli 

JMP $  ;Infinite loop, hang it here. 

times 510 - ($ - $$) db 0 ;Fill the rest of sector with 0 
dw 0xAA55   ;Add boot signature at the end of bootloader 

Обратите внимание на прописанную инструкцию cli. Когда я удаляю точку с запятой и только точку с запятой, «А» больше не печатается. Я не понимаю, как очистка флага IF может иметь побочный эффект, влияющий на то, что находится в памяти. Если бы кто-то мог пролить свет на это, это было бы здорово.

О, и для чего это стоит, команды, которые я использую для запуска загрузчика

nasm -o bl.bin bl.asm 
qemu -fda bl.bin 

Я получил пылали где-то еще, и читать столько, сколько я мог. Кто-то упомянул настройку стека, но я не понимаю, что это имеет отношение к моей проблеме.

Справка действительно оценена!

+0

Вы уверены, что это не так? С неповрежденным CLI отображается «A», а с CLI прокомментировано, что «A» не отображается? –

+0

Нет, это так. – oadams

ответ

0

Зависит от оборудования для видеокарты! Некоторые видеокарты напрямую не поддерживают все видеорежимы, но только имитируют. Таким образом, через прерывания внутренняя часть кода отвечает за копирование этой памяти каждые несколько мс в память графической карты. Когда вы выключаете прерывания, вы также отключите обновление внутренней видеопамяти на графической карте. Команда CLI отключает все программные прерывания, поэтому присутствуют только аппаратные инструкции, поэтому BIOS не будет работать правильно. Вы можете использовать инструкцию CLI только для синхронизации чтения или записи в память или порты ввода-вывода. Чтобы убедиться в моем ответе, вы можете сделать небольшую паузу около 6 мс, прежде чем выполнять инструкцию CLI, и будет показан символ.

+0

Оказывается, это проблема с qemu, которую я использовал. – oadams

+0

Но отключение прерываний в эмулированном коде - это не то же самое, что ДЕЙСТВИТЕЛЬНО поворот прерываний. Программное обеспечение qemu должно быть виртуализировано, и его прерывания прекрасны, поэтому он может обновлять экран. –

+0

Как я уже говорил до паузы в несколько мсек до того, как инструкция CLI ответит на это сомнение. –