2011-04-18 24 views
2

我的期望是打印一個字符串,但沒有打印出來。 當我縮短字符串時,它有時會起作用,當我再次使它們變長時,它有時會起作用。爲什麼這個引導加載程序代碼不起作用?

我不知道爲什麼這不起作用。

有人能幫助我嗎? 謝謝。

我使用的組件,代碼是:

(Emacs的23,的Ubuntu 10.10,NASM,VirtualBox的OSE)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
org 0x7c00 
bits 16 
str: 
    db "Some say the world will end in fire",10,13 
    db "Some say in ice",10,13 
    db "From what I've tasted of desire",10,13 
    db "I hold with those who favor fire",10,13 
    db "But if I had to perish twice,",10,13 
    db "I think I know enough of hate",10,13 
    db "To say that for destruction ice",10,13 
    db "is also great and would suffice." 
    db "Robert Frost - Fire and Ice" 
    db 0 
start: 
    xor ax,ax 
    mov ds,ax 
    mov es,ax 
    mov si, str 
    xor bx,bx 
    mov ah, 0x0e 
print: 
    lodsb ;al = current char 
    cmp al, 0 
    je end 
    int 0x10 
    jmp print 
end:  
    cli 
    hlt 

    times 510 - ($-$$) db 0 
    dw 0xAA55 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
+0

我想你需要添加一個CLD指令,以確保lodsb增加si,並且不會減少它。不過,我認爲還有其他一些問題。 – 2011-04-18 07:05:29

回答

9

因爲它開始就在在7c00指令執行代碼。不幸的是,你有你的字符串。

您應該在jmp指令前面加上該字符串,以便跳轉到start

這通常是一個短跳EB xx後跟NOP 90。一些BIOS'可能會堅持就是這種形式,即使它對處理器無關緊要。

換句話說,你會尋找類似:

org 0x7c00 
bits 16 
realstart: 
    jmp short start 
    nop 
str: 
    db "Some say the world will end in fire",10,13 
    : 
    db "Robert Frost - Fire and Ice" 
    db 0 
start: 
    xor ax,ax 
    : 

只需記住的是,短期跳躍有限,因爲它可以去什麼距離,大約+/- 128個字節,所以你的字符串大小將受到限制。如果您的BIOS不需要EB xx 90格式,則可以定期跳轉。

你可以嘗試其他的事情是整個字符串移到hlt指令後:

org 0x7c00 
bits 16 
start: 
    xor ax,ax 
    : 
end:  
    cli 
    hlt 
str: 
    db "Some say the world will end in fire",10,13 
    : 
    db "Robert Frost - Fire and Ice" 
    db 0 

但同樣,這取決於你的BIOS不需要在一開始的jmp/nop組合。

+0

謝謝。但我仍然懷疑。你會解決我的問題=爲什麼「有時」工作,即使字符串正確在0x7c00? – 2011-04-18 08:19:06

+2

可能有些字符串可能被解釋爲有效的代碼,最終會執行到「真實」的代碼。 – 2011-04-18 09:50:32

1

驗證paxdiablo和Igor Skochinsky是否正確的一種好方法是將文本字符串放入文件中,然後通過反彙編程序運行。正確打印的較短的字符串應該反彙編成不會損害任何內容的代碼字符串。較短的字符串失敗,較長的字符串將包含非法指令,跳轉或調用指令,或者甚至在結尾處有一個2或3字節指令,用於在您的開始處吞噬"xor ax,ax"指令的操作碼碼。

相關問題