2016-10-22 53 views
2

我終於明白了彙編和裸機編程的基礎知識。或者至少這是我的想法。我寫這個(自己的第一次:))蜂鳴器引導程序(Intel x86)

[BITS 16] 
[ORG 0X7C00] 

Yaz: MOV SI, Msa 
MOV AL, [SI] 
INC SI 
INT 0x10 
OR AL, AL 
JZ Yaz 
JMP Halt   

Halt: hlt 

Msa db "Test Successful", 0 

TIMES 510 - ($ - $$) DB 0 
DW 0xAA55 

我燒入USB這(我深知這些測試在真實的硬件是不是一個好主意),並重新啓動。 BIOS執行它的測試,並引導到我的引導程序(或「程序」,因爲它實際上並沒有啓動)。它沒有打印出任何東西,我的電腦開始發出嗶嗶聲。

我已經禁用啓動扇區病毒防護,快速啓動,我從字面上嘗試了一切,但每次啓動到我的東西時,它只是在我的臉上發出嗶嗶聲,直到我按CTRL + ALT + DELETE出它。

我做錯了什麼?提前致謝。

+0

可能想嘗試這樣的:HTTP://www.capp-sysware .com/misc/stackoverflow/40143596/boot.asm。但我懷疑,因爲你沒有設置DS(將其設置爲零),這可能是一個問題(從錯誤的段讀取字符串),並且不會以無限循環結束。想想你必須在'Halt:hlt'之後移動'JMP Halt'。既然你沒有一個適當的無限循環,它可能會運行'hlt'後發生在內存中的任何事情。 –

+0

這可能有助於指定您的主板,因爲嗶聲代碼通常具有製造商特定的含義,可以幫助調試。 – Aurora0001

+0

此外,我實際上沒有看到您設置了打印的_AH_(Int 10h的子功能)。我想你想把0eh註冊到_AH_來使用[BIOS TTY輸出](http://www.ctyme.com/intr/rb-0106.htm)。你應該在打印之前檢查NUL(0)終止符,而不是之後。 –

回答

2

審查意見的工作代碼,不發出蜂鳴聲在我的電腦,而是打印出我一直在尋找的字符串後:

org 7c00h 
bits 16 
main: 
xor ax, ax 
mov ds, ax 
mov es, ax   
mov ss, ax 
mov sp, 7c00h  
cld     
xor bx, bx   
mov si, MESAJ  
call yaz 
cli 
durdur: 
hlt 
jmp durdur 
yaz: 
push ax 
mov ah, 0Eh  
yenikarakter: 
lodsb         
test al, al 
je bitir   
int 10h   
jmp yenikarakter  
bitir: 
pop ax 
ret 
MESAJ: 
db "Test basarili!", 10, 13, 0 
times 510-($-$$) db 00h 
dw 0xAA55