Влияет ли запись значения в регистр BX на регистр ES? - PullRequest
2 голосов
/ 28 марта 2019
[org 0x7c00]
    mov bp, 0x8000 ; set the stack safely away from us
    mov sp, bp

    mov bx, 0x9000 ; es:bx = 0x0000:0x9000 = 0x09000

Как видно из комментария, в нем написано: es:bx = 0x0000:0x9000 = 0x09000.Есть ли связь между регистром ES и BX ?Код только устанавливает регистр BX , но комментарий показывает регистр ES также установлен?

1 Ответ

5 голосов
/ 28 марта 2019

TL; DR : настройка регистра BX не влияет на сегментный регистр ES .


Учебное пособие OS , на которое вы смотрите, содержит потенциальные ошибки.Автор неправильно предполагает, что ES установлен в ноль BIOS перед передачей управления загрузчику.Это не гарантировано.Вам нужно явно установить ES на ноль самостоятельно.Мои советы по загрузчику охватывают эту тему:

  1. Когда BIOS переходит к вашему коду, вы не можете полагаться на регистры CS, DS, ES, SS, SP, имеющие действительныеили ожидаемые значения.Они должны быть настроены соответствующим образом при запуске вашего загрузчика.Вы можете только гарантировать, что ваш загрузчик будет загружен и запущен с физического адреса 0x00007c00 и что номер загрузочного диска загружен в регистр DL.

* * * * * * * * * * * * *Код учебного пособия для ОС, который вы просматриваете, должен был выглядеть следующим образом:

xor ax, ax     ; AX=0 (XOR register to itself clears all bits)
mov es, ax     ; ES=0
mov bx, 0x9000 ; ES:BX = 0x0000:0x9000 = 0x09000 . Memory location disk read will read to

Если учесть приведенный выше совет по загрузчику, то запуск загрузчика должен выглядеть примерно так:

mov bp, 0x8000 
xor ax, ax     ; AX=0 (XOR register to itself clears all bits)
mov es, ax     ; ES=0
mov ds, ax     ; DS=0
mov ss, ax     ; SS=0
mov sp, bp     ; SP=0x8000 (SS:SP = stack pointer)

mov bx, 0x9000 ; ES:BX = 0x0000:0x9000 = 0x09000 . Memory location disk read will read to

Обучающие программы по загрузчику нередко имеют неточную или вводящую в заблуждение информацию.

...