VMWare Workstation 的奇怪引导加载程序行为(无法打印字符)
VMWare Workstation's strange bootloader behaviour (failing to print a character)
.code16
.text
.org 0x0
.global _start
_start:
jmp _testing
nop
_testing:
mov [=10=]x0E, %ah
mov the_byte, %al #the line in question
int [=10=]x10
jmp .
the_byte: .byte 0x41
.fill (510-(.-_start)), 1, 0
.word 0xAA55
这个简单的 'bootloader' 本来应该将 A
打印到屏幕上,但是当我使用 VMWare Workstation 16 (unlike Bochs 时它却失败了在屏幕上显示 A
)。如果我将 有问题的行 更改为
mov [=11=]x41, %al
我也可以在 VMWare Workstation 上看到 A
。
您有没有想过是什么导致了这种奇怪的行为?
PS。它确实使用单独的链接器文件加载到 0x7C00。
显然,mov the_byte, %al
被组装成类似于 mov %ds:0x7C0C, %al
的东西,因此必须将 DS 清零(连同其他段指针):
cli
mov %cs, %ax # CS is set to 0x0
mov %ax, %es # ES = CS = 0x0
mov %ax, %ds # DS = CS = 0x0
mov %ax, %ss # SS = CS = 0x0
sti
.code16
.text
.org 0x0
.global _start
_start:
jmp _testing
nop
_testing:
mov [=10=]x0E, %ah
mov the_byte, %al #the line in question
int [=10=]x10
jmp .
the_byte: .byte 0x41
.fill (510-(.-_start)), 1, 0
.word 0xAA55
这个简单的 'bootloader' 本来应该将 A
打印到屏幕上,但是当我使用 VMWare Workstation 16 (unlike Bochs 时它却失败了在屏幕上显示 A
)。如果我将 有问题的行 更改为
mov [=11=]x41, %al
我也可以在 VMWare Workstation 上看到 A
。
您有没有想过是什么导致了这种奇怪的行为?
PS。它确实使用单独的链接器文件加载到 0x7C00。
显然,mov the_byte, %al
被组装成类似于 mov %ds:0x7C0C, %al
的东西,因此必须将 DS 清零(连同其他段指针):
cli
mov %cs, %ax # CS is set to 0x0
mov %ax, %es # ES = CS = 0x0
mov %ax, %ds # DS = CS = 0x0
mov %ax, %ss # SS = CS = 0x0
sti