预取:EIP [00010000] > CS.limit [0000ffff] 在第二阶段执行期间
prefetch: EIP [00010000] > CS.limit [0000ffff] during second stage execution
我创建了一个简单的引导加载程序,其中第二阶段(内核)加载到 0x1000:0x0000 的内存中,我的引导加载程序从 jmp 0x1000:0000
开始执行。我的引导加载程序基于
中的那个
我的第二个stage/kernel是一个简单的命令系统。
命令系统只有一个命令,即"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
谁能告诉我这是什么意思,为什么会这样?
正如 Jester 所指出的那样,这个问题似乎是一个微不足道的问题。在 com_help 你这样做:
com_help:
push bx
mov bx, help1_msg
call str_prt
call new_line
ret
你 push BX
在堆栈上,但完成后不要用 pop BX
恢复它。这将导致 ret
指令从堆栈中弹出错误的 return 地址并继续执行到您不打算去的内存位置。这可能导致程序挂起,甚至像 BOCHS 这样的模拟器根据情况抛出消息。代码应如下所示:
com_help:
push bx
mov bx, help1_msg
call str_prt
call new_line
pop bx
ret
我创建了一个简单的引导加载程序,其中第二阶段(内核)加载到 0x1000:0x0000 的内存中,我的引导加载程序从 jmp 0x1000:0000
开始执行。我的引导加载程序基于
我的第二个stage/kernel是一个简单的命令系统。
命令系统只有一个命令,即"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
谁能告诉我这是什么意思,为什么会这样?
正如 Jester 所指出的那样,这个问题似乎是一个微不足道的问题。在 com_help 你这样做:
com_help:
push bx
mov bx, help1_msg
call str_prt
call new_line
ret
你 push BX
在堆栈上,但完成后不要用 pop BX
恢复它。这将导致 ret
指令从堆栈中弹出错误的 return 地址并继续执行到您不打算去的内存位置。这可能导致程序挂起,甚至像 BOCHS 这样的模拟器根据情况抛出消息。代码应如下所示:
com_help:
push bx
mov bx, help1_msg
call str_prt
call new_line
pop bx
ret