Решение проблемы в загрузчике hello world с помощью VMWare Player

Я использую VMWare Workstation Player 15.

Я готовлю такой загрузчик hello world как boot.s:

.code16 
.global init
init:
  mov $0x0e, %ah
  mov $0x41, %al
  int $0x10
  hlt
msg: .byte 0x41
.fill 510-(.-init), 1, 0
.word 0xaa55

Встроить его в двоичный файл:

$ as -o boot.o boot.s
$ ld -o boot.bin --oformat binary -e init -Ttext 0x7c00 -o boot.bin boot.o

В VMWare Workstation Player создайте виртуальную машину, добавив дискету, так как boot.bin является ее содержимым. Затем включите эту виртуальную машину, я вижу отображаемый символ A.

Text

Пока все хорошо.

Но когда я изменяю следующую строку:

  mov $0x41, %al

в

  mov $msg, %bx
  mov (%bx), %al

Символ A не будет отображаться. Я хочу спросить, что в этом плохого?

Учебник находится здесь: https://medium.com/@g33konaut/writing-an-x86-hello-world-boot-loader-with-assembly-3e4c5bdd96cf

Объяснение последних двух строк:

" Первая строка загружает адрес первого байта в регистр bx (мы используем весь регистр, потому что адреса имеют длину 16 бит).

Затем вторая строка загружает значение, хранящееся по адресу из bx, в al, так что первый символ сообщения заканчивается в al, потому что bx указывает на его адрес. "


person L. Ouyang    schedule 27.05.2020    source источник
comment
Вы забыли инициализировать ds нулем. В реальном режиме используется сегментация.   -  person Jester    schedule 27.05.2020
comment
Спасибо Jester, после инициализации ds до нуля проблема устранена.   -  person L. Ouyang    schedule 27.05.2020