为什么此汇编代码无法打印到VGA缓冲区

问题描述 投票:0回答:1

我有以下汇编代码。我正在尝试创建一个小的引导程序以进入保护模式。为了测试目的,我需要从32位模式将内容打印到VGA,但是它不起作用。我从网络上的各种资源中找到了代码,发现其中大多数都有类似的代码,可以像以下示例一样正常工作:Printing characters to screen ASM in protected mode

bits 16

mov ah, 0x00  ;Set up video mode
mov al, 0x03
int 0x10

gdt_start:
        dq 0x0
gdt_code:
        dw 0xFFFF
        dw 0x0
        db 0x0
        db 10011010b
        db 11001111b
        db 0x0
gdt_data:
        dw 0xFFFF
        dw 0x0
        db 0x0
        db 10010010b
        db 11001111b
        db 0x0  

gdtr:
        dw 24
        dd gdt_start

lgdt [gdtr]

cli

mov eax, cr0
or al, 1
mov cr0, eax

jmp 0x08:protectedMode 

bits 32

protectedMode:
    mov ax, 0x10
    mov ds, ax
    mov es, ax 
    mov fs, ax
    mov gs, ax
    mov ss, ax

    mov word [0xb8000], 0x0769 

times 510 - ($-$$) db 0
dw 0xaa55

我用以下代码编译代码:

nasm -fbin boot.asm -oboot.bin

并使用以下结果运行结果:

qemu-system-x86_64 -fda boot.bin

它什么也没做。

当我用以下命令反汇编代码时:

ndisasm boot.bin

它输出以下结果:

enter image description here

为什么在附加零之前有指令

mov dword [di], 0xb8000

应该是

mov word [0xb8000], 0x0769
assembly nasm bootloader
1个回答
0
投票

[拥有此数据块时:

gdt_start:
        dq 0x0
gdt_code:
        dw 0xFFFF
        dw 0x0
        db 0x0
        db 10011010b
        db 11001111b
        db 0x0
gdt_data:
        dw 0xFFFF
        dw 0x0
        db 0x0
        db 10010010b
        db 11001111b
        db 0x0  

gdtr:
        dw 24
        dd gdt_start

它位于执行路径中。该数据将由处理器作为代码执行,作为int 0x10之后的下一条指令。在mov word [0xb8000], 0x0769之后将其向下移。

[在执行该指令之后,您还需要添加一个无限循环,以防止执行陷入任何垃圾(如果放置在GDT表中)。

始终记住,汇编是低级的。无论您坚持什么代码,无论实际有意义的指令是什么,如果处理器接触到代码,都将被视为代码。

© www.soinside.com 2019 - 2024. All rights reserved.