2015-12-07 74 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的评论,最初是正确的。 –