我有以下汇编代码。我正在尝试创建一个小的引导程序以进入保护模式。为了测试目的,我需要从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
它输出以下结果:
为什么在附加零之前有指令
mov dword [di], 0xb8000
应该是
mov word [0xb8000], 0x0769
[拥有此数据块时:
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表中)。
始终记住,汇编是低级的。无论您坚持什么代码,无论实际有意义的指令是什么,如果处理器接触到代码,都将被视为代码。