2012-03-31 36 views
4

我已經寫了簡單的引導程序基於:http://www.viralpatel.net/taj/tutorial/hello_world_bootloader.php的Bootloader與圖形(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中測試。

編輯:忘記更改視頻模式 - 但仍然無法正常工作。

編輯2:此代碼: [比特16]; 16位 [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 2012-03-31 17:38:43

回答

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,您可以直接寫入。

編輯:我認爲INT 0x10, AH=0x0C是你正在嘗試使用,intead INT 0x10, AH=0x09

+0

謝謝,這解決了我的問題。 – djmati11 2012-03-31 21:14:28

1

短的答案:我認爲這2行:

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

應該是:

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

(無方括號,並使用低16位)

較長的回答:我不認爲代碼被掛在那裏,你認爲它是。我希望它被掛由於這兩條線:

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 2012-03-31 17:36:24

+0

我用CX和EBX替換了EAX和DX,並刪除了EAX和EBX的每一個引用,但仍然不起作用 – djmati11 2012-03-31 17:40:44

+0

您可能需要更新您問題中的代碼。我不明白你所做的更正,或者如果我理解他們,他們是不正確的。 – 2012-03-31 18:22:56