2012-03-31 3 views
4

я написал простой загрузчике на основе: http://www.viralpatel.net/taj/tutorial/hello_world_bootloader.phpЗагрузчик с графикой (NASM)

[BITS 16] ;16bit 
[ORG 0x7C00] ;offset 

MOV AH, 0x00 ; change video mode 
MOV AL, 0x13 ; 0x13 
INT 0x10 ; interrupt 
CALL DrawTenLines ;lets draw 
JMP $  ;hang it 

DrawOneLine: 
MOV CX, 0x00 ;x = 0 

nextpixel: 
MOV AH, 0x09 ;func number - WritePixelOnScreen [wiki] 
MOV AL, 0x05 ;color - Magenta 
MOV BH, 0x00 ;Page no 
INT 0x10 ;Video interrupt - BIOS 
CMP CX, 10 ;if (x == 10) { 
JE exitfunc ;exit function } else { 
JNE nextpixel ;next pixel } 
ADD CX, 0x01 ;add one :D 
exitfunc: ;exit :D 
RET 

DrawTenLines: ;draw some lines 
MOV DX, 0x00 ;y = 0 
CALL DrawOneLine 
MOV DX, 0x01 ;y = 1 
CALL DrawOneLine 
MOV DX, 0x02 ;y = 2 
CALL DrawOneLine 
MOV DX, 0x03 ;y = 3 
CALL DrawOneLine 
MOV DX, 0x04 ;y = 4 
CALL DrawOneLine 
MOV DX, 0x05 ;y = 5 
CALL DrawOneLine 
RET 

;Data 

TIMES 510 - ($ - $$) db 0 ;Fillers 
DW 0xAA55   ;boot signature 

Но это не работает, как ожидалось - не рисует, только черный экран и зависание (как и ожидалось).

Составлено с NASM, -f bin. Пример с этого сайта работает. Протестировано в Virtualbox.

EDIT: Забыл изменить режим видео - но все равно не работает.

EDIT 2: Этот код: [BITS 16]; 16bit [ORG 0x7C00]; смещение

MOV AH, 0x00 
MOV AL, 0x13 
INT 0x10 
MOV AH, 0x09 ;WritePixelOnScreen [wiki] 
MOV AL, 0x0F ;color - White 
MOV BH, 0x00 ;page no. 
MOV CX, 1 ;x 
MOV DX, 1 ;y 
INT 0x10 ;interrupt 
MOV CX, 2 ;x 
MOV DX, 1 ;y 
INT 0x10 ;interrupt 
MOV CX, 3 ;x 
MOV DX, 1 ;y 
INT 0x10 ;interrupt 
JMP $  ;hang 

;Data 

TIMES 510 - ($ - $$) db 0 ;filler 
DW 0xAA55   ;boot signature 

Делает: http://i.imgur.com/UGS3m.png

+0

BTW. Что со второй частью? Можете ли вы мне помочь и с этим? – djmati11

ответ

2

У вас есть бесконечный цикл в DrawOneLine. Эта строка никогда не выполняется:

ADD CX, 0x01 ;add one :D 

Ваш код перекручивание должен выглядеть следующим образом:

CMP CX, 10 ;if (x == 10) { 
JE exitfunc ;exit function } else { 
ADD CX, 0x01 ;add one :D 
JMP nextpixel ;next pixel } 

Я думаю, ваша проблема может использовать неверный видеорежим.Вы устанавливаете режим видео в режим 0x13, а затем вы вызываете INT 0x10, AH=0x09, что, я считаю, является текстовым режимом. IIRC, экранные данные для режима 0x13 расположены на 0xA000: 0x0000, и вы можете писать на него напрямую.

EDIT: Я думаю, что INT 0x10, AH=0x0C это то, что вы пытались использовать, начиная с INT 0x10, AH=0x09.

+0

Спасибо, это исправило мою проблему. – djmati11

1

Короткий ответ: Я думаю, что эти 2 строки:

MOV CX, [EAX] ;x 
MOV DX, [EBX] ;y 

должно быть:

MOV CX, AX ;x 
MOV DX, BX ;y 

(. Нет квадратные скобки, и использовать нижние 16 бит)

Более длинный ответ: Я не думаю, что код висит где вы думаете. Я бы ожидать, что она будет висеть из-за этих 2-х линий:

MOV CX, [EAX] ;x 
MOV DX, [EBX] ;y 

Ваш код комментарии показывают, что вы понимаете, C, поэтому я объясню в этих терминах. Инструкции:

MOV EAX, 0x00 
MOV CX, [EAX] 

эквивалентны:

unsigned int EAX = 0; 
unsigned short CX; 
CX = (unsigned short)(*EAX); 

я, возможно, не отвержение правильно. Дело в том, что размещение скобок вокруг EAX ("[EAX]") использует содержимое EAX в качестве указателя. Я ожидаю, что ваш код будет разыменовывать указатель NULL, который может вызвать зависание.

EDIT, в вашем обновлении

Вы пытаетесь написать пиксель на экране с помощью этого прерывания:

MOV AH, 0x09 ;func number - WritePixelOnScreen [wiki] 
MOV AL, 0x05 ;color - Magenta 
MOV BH, 0x00 ;Page no 
INT 0x10 ;Video interrupt - BIOS 

Я не вижу никаких координат параметры там. Я искал функции int 10h, и я обнаружил, что AH = 09h - "write character and attribute at cursor position" - не то, что вы хотите. Посмотрите на AH=0Ch -- "change color for a single pixel". Эта ссылка содержит краткий пример, демонстрирующий правильное использование.

+0

Но спасибо, это мне поможет ... – djmati11

+0

Я заменил EAX на CX и EBX на DX и удалил каждую ссылку на EAX и EBX, но все еще не работает – djmati11

+0

Возможно, вам придется обновить код в своем вопросе. Я не понимаю исправлений, которые вы сделали, или если я их понимаю, они неверны. –

Смежные вопросы