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