尝试切换到32位模式时启动循环
当使用我的引导程序IT引导循环从16位切换到32位模式时,我知道这是导致问题的原因,因为所有代码都会导致预期结果。关于可能出了什么问题的任何建议?
我的代码:
[bits 16]
[org 0x7c00]
mov [bootDrive], dl
mov bp, 0x7c00
mov sp, bp
mov bx, welcomeMsg
call print
call inputStart
in al, 0x92
or al, 2
out 0x92, al
cli
lgdt [descriptorGDT]
mov eax, cr0
or eax, 1
mov cr0, eax
jmp GDTCodeSeg:startProtectedMode
jmp $
%include "src/print.asm"
%include "src/BIOSKeyboardInput.asm"
%include "src/GDT.asm"
bootDrive: db 0
welcomeMsg: db "Hello there! Successfully entered bootloader.", 0
[bits 32]
startProtectedMode:
mov ax, GDTDataSeg
mov ds, ax
mov ss, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ax, 0x0F41
mov [0xb8000], ax
jmp $
times 510-($-$$) db 0
db 0x55, 0xaa
gdt.asm:
GDTNullSeg:
dd 0x0
dd 0x0
GDTCodeSeg:
dw 0xFFFF
dw 0x0000
db 0x00
db 0b10011010
db 0b11001111
db 0x00
GDTDataSeg:
dw 0xFFFF
dw 0x0000
db 0x00
db 0b10010010
db 0b11001111
db 0x00
GDTEnd:
descriptorGDT:
GDTSize:
dw GDTEnd - GDTNullSeg - 1
dd GDTNullSeg
GDTCodeSegSize equ GDTCodeSeg - GDTNullSeg
GDTDataSegSize equ GDTDataSeg - GDTNullSeg
编辑: print.asm:
print:
mov ah, 0x0e
loop:
mov al, [bx]
cmp al, 0
je exit
int 0x10
inc bx
jmp loop
exit:
ret
bioSkeyboardInput.asm:
inputStart:
mov bx, inputInfo
call print
call input
ret
input:
mov ah, 0x00
int 0x16
cmp al, 0x1B
je exitInput
cmp ah, 0x4B
je leftArrowInput
cmp ah, 0x4D
je rightArrowInput
cmp ah, 0x48
je upArrowInput
cmp ah, 0x50
je downArrowInput
cmp ah, 0x47
je homeInput
mov ah, 0x0e
int 0x10
cmp al, 0x8
je backspaceInput
jmp input
leftArrowInput:
mov al, 0x8
mov ah, 0x0e
int 0x10
jmp input
rightArrowInput:
mov al, 0x20
mov ah, 0x0e
int 0x10
jmp input
upArrowInput:
jmp input
downArrowInput:
jmp input
backspaceInput:
mov al, 0x20
int 0x10
mov al, 0x8
int 0x10
jmp input
homeInput:
mov al, 0x17
mov ah, 0x0e
int 0x10
jmp input
exitInput:
ret
inputInfo: db 0xA, 0xD, "To exit input mode click ESC.", 0
When switching from 16 bit to 32 bit mode using my bootloader it boot loops, I know this is whats causing the issue as all code before causes the expected results. Any suggestions as to what may be wrong?
My code:
[bits 16]
[org 0x7c00]
mov [bootDrive], dl
mov bp, 0x7c00
mov sp, bp
mov bx, welcomeMsg
call print
call inputStart
in al, 0x92
or al, 2
out 0x92, al
cli
lgdt [descriptorGDT]
mov eax, cr0
or eax, 1
mov cr0, eax
jmp GDTCodeSeg:startProtectedMode
jmp $
%include "src/print.asm"
%include "src/BIOSKeyboardInput.asm"
%include "src/GDT.asm"
bootDrive: db 0
welcomeMsg: db "Hello there! Successfully entered bootloader.", 0
[bits 32]
startProtectedMode:
mov ax, GDTDataSeg
mov ds, ax
mov ss, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ax, 0x0F41
mov [0xb8000], ax
jmp $
times 510-($-$) db 0
db 0x55, 0xaa
GDT.asm:
GDTNullSeg:
dd 0x0
dd 0x0
GDTCodeSeg:
dw 0xFFFF
dw 0x0000
db 0x00
db 0b10011010
db 0b11001111
db 0x00
GDTDataSeg:
dw 0xFFFF
dw 0x0000
db 0x00
db 0b10010010
db 0b11001111
db 0x00
GDTEnd:
descriptorGDT:
GDTSize:
dw GDTEnd - GDTNullSeg - 1
dd GDTNullSeg
GDTCodeSegSize equ GDTCodeSeg - GDTNullSeg
GDTDataSegSize equ GDTDataSeg - GDTNullSeg
EDIT:
print.asm:
print:
mov ah, 0x0e
loop:
mov al, [bx]
cmp al, 0
je exit
int 0x10
inc bx
jmp loop
exit:
ret
BIOSKeyboardInput.asm:
inputStart:
mov bx, inputInfo
call print
call input
ret
input:
mov ah, 0x00
int 0x16
cmp al, 0x1B
je exitInput
cmp ah, 0x4B
je leftArrowInput
cmp ah, 0x4D
je rightArrowInput
cmp ah, 0x48
je upArrowInput
cmp ah, 0x50
je downArrowInput
cmp ah, 0x47
je homeInput
mov ah, 0x0e
int 0x10
cmp al, 0x8
je backspaceInput
jmp input
leftArrowInput:
mov al, 0x8
mov ah, 0x0e
int 0x10
jmp input
rightArrowInput:
mov al, 0x20
mov ah, 0x0e
int 0x10
jmp input
upArrowInput:
jmp input
downArrowInput:
jmp input
backspaceInput:
mov al, 0x20
int 0x10
mov al, 0x8
int 0x10
jmp input
homeInput:
mov al, 0x17
mov ah, 0x0e
int 0x10
jmp input
exitInput:
ret
inputInfo: db 0xA, 0xD, "To exit input mode click ESC.", 0
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
答复在评论中对Jester的答复:
问题是:
您
需要提供细分选择器。
,应该是:
相反
Answer thanks to Jester in comments:
Issue is:
and
You need to supply a segment selector.
Instead should be:
and