尝试切换到32位模式时启动循环

发布于 2025-01-22 11:39:06 字数 2443 浏览 3 评论 0原文

当使用我的引导程序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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

囚你心 2025-01-29 11:39:06

答复在评论中对Jester的答复:

问题是:

jmp GDTCodeSeg:startProtectedMode

mov ax, GDTDataSeg

需要提供细分选择器。
,应该是:

jmp 8:startProtectedMode

相反

mov ax, 16

Answer thanks to Jester in comments:

Issue is:

jmp GDTCodeSeg:startProtectedMode

and

mov ax, GDTDataSeg

You need to supply a segment selector.
Instead should be:

jmp 8:startProtectedMode

and

mov ax, 16
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文