2015-12-07 73 views
1

我創建了一個簡單的引導加載程序,第二階段(內核)加載到內存中的0x1000:0x0000,我的啓動加載程序開始執行jmp 0x1000:0000。我的引導加載器是基於一個在此StackOverflow questionprefetch:EIP [00010000]> CS.limit [0000ffff]在第二階段執行

我的第二階段/內核是一個簡單的命令系統。

該命令系統僅具有一個命令,即"help"(現在)。一切工作正常,但是當我鍵入命令help,我得到的Bochs模擬器錯誤:

[CPU0 ] prefetch: EIP [00010000] > CS.limit [0000ffff] 

這是代碼:

[BITS 16] 
[ORG 0x0000] 

mov ax, cs 
mov ds, ax 
xor cx, cx 
mov bx, welcome_msg 
call str_prt 
call new_line 
mov bx, creator_msg 
call str_prt 
call new_line 
mov bx, boot_msg 
call str_prt 
call new_line 
mov bx, [buffer] 

mov ah, 0x0e 
mov al, 0x0a 
int 0x10 
mov al, 0x0d 
int 0x10 
mov al, '>' 
int 0x10 

loop: 
in al, 64h 
test al, 1  
je loop 
xor ah, ah 
int 0x16 
call key_scan 
jmp loop 

key_scan: 
cmp al, 0x08 
je back_space 
cmp al, 0x0d 
je enter 
cmp cx, 0x0041 
je end 
mov ah, 0x0e 
int 0x10 
mov bx, buffer 
add bx, cx 
mov [bx], al 
inc cx 
jmp end 
back_space: 
cmp cx, 0x00 
je end 
dec cx 
mov ah, 0x0e 
mov al, 0x08 
int 0x10 
mov al, 0x20 
int 0x10 
mov al, 0x08 
int 0x10 
jmp end 
enter: 
xor cx, cx 
mov ah, 0x0e 
mov al, 0x0a 
int 0x10 
mov al, 0x0d 
int 0x10 
call pro_com 
call clear_buffer 
mov ah, 0x0e 
mov al, '>' 
int 0x10 
end: 
ret 

str_prt: 
pusha 
str: 
mov ah, 0x0e 
mov al, [bx] 
cmp al, '$' 
je str_end 
int 0x10 
add bx, 1 
jmp str 
str_end: 
popa 
ret 

new_line: 
push ax 
mov ah, 0x0e 
mov al, 0x0a 
int 0x10 
mov al, 0x0d 
int 0x10 
pop ax 
ret 

clear_buffer: 
push ax 
push bx 
push cx 
mov bx, buffer 
xor cx, cx 
xor ax, ax 
start: 
cmp cx, 0x41 
je end_buff 
mov [bx], ax 
inc bx 
inc cx 
jmp start 
end_buff: 
pop cx 
pop bx 
pop ax 
ret 

pro_com: 
push bx 
push ax 
mov bx, buffer 
mov al, [bx] 
cmp al, 'h' 
jne help_end 
inc bx 
mov al, [bx] 
cmp al, 'e' 
jne help_end 
inc bx 
mov al, [bx] 
cmp al, 'l' 
jne help_end 
inc bx 
mov al, [bx] 
cmp al, 'p' 
jne help_end 
call com_help 
jmp pro_end 
help_end: 
mov bx, not_found 
call str_prt 
call new_line 
pro_end: 
pop ax 
pop bx 
ret 

com_help: 
push bx 
mov bx, help1_msg 
call str_prt 
call new_line 
ret 

buffer times 64 db 0 

welcome_msg: 
db 'Welcome to myOS$' 
creator_msg: 
db 'Created by Vishnu Shankar.B$' 
boot_msg: 
db 'Booting command line interface...$' 
not_found: 
db 'Command cannot be resolved!$' 
help1_msg: 
db 'Help not avilable!$' 

jmp $ 
times 4096 - ($ - $$) db 0 

有人能告訴我這是什麼意思,爲什麼正在發生?

+1

哇,沒有意見的代碼! – Gunner

+1

'com_help'有'push bx',但沒有'pop bx'。 – Jester

+0

我會認爲這是你以前寫的已加載位於0x1000引導加載程序的第二階段:爲0x0000(?和你遠跳樓吧) –

回答

2

這個問題似乎是作爲小丑標識是小事一樁。在com_help你這樣做:

com_help: 
    push bx 
    mov bx, help1_msg 
    call str_prt 
    call new_line 
    ret 

push BX在堆棧上,但不完成當它與pop BX恢復。這將導致ret指令彈出錯誤的返回地址出棧,並繼續執行到你不打算去的存儲位置。這可能會導致程序掛起,甚至是模擬器像BOCHS扔視情況而定的消息。代碼應該看起來像:

com_help: 
    push bx 
    mov bx, help1_msg 
    call str_prt 
    call new_line 
    pop bx 
    ret 
+0

我也將它標記爲社區Wiki,因爲它是Jester的評論,最初是正確的。 –