Я использую 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
.
Пока все хорошо.
Но когда я изменяю следующую строку:
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 указывает на его адрес. "
ds
нулем. В реальном режиме используется сегментация. - person Jester   schedule 27.05.2020ds
до нуля проблема устранена. - person L. Ouyang   schedule 27.05.2020