Почему строка печатается только желтым, несмотря на изменение значения в bl?
bits 32
main:
mov ah, 09h
mov bh, 0
mov cx, 80
mov bl, 01110000b
mov al, ' '
int 10h
jmp $
times 512-($-$$) db 0
2 ответа
Вы еще не в 32-битном режиме, поэтому используйте bits 16
,
Также в защищенном режиме функции BIOS недоступны. Просто чтобы вы знали и не пытались звонить им в защищенном режиме.
Это, на самом деле, bits 32
это удерживает это от работы. Вы можете увидеть, что происходит, используя ndisasm. Соберите его как есть, и разберите его с помощью ndisasm. Значение по умолчанию для ndisasm составляет 16 бит, но вы можете указать -b16
для ясности. Это то, что процессор "увидит", если он находится в 16-битном режиме... что это такое. Потребуется еще немного кода, чтобы переключиться в 32-битный режим - вы скоро доберетесь до этого, но ЦП запускается в 16-битном режиме (даже 64-битном ЦП). Чтобы увидеть, что "увидит" процессор, если / когда он находится в 32-битном режиме, снова разберите с помощью -b32
, Увидеть разницу? Ваш mov bl, 01110000b
исчез, будучи "сожранным" mov cx, 80
! Затем попробуйте снова без bits 32
, Ты можешь сказать bits 16
, но это все равно Nasm по умолчанию.
Есть тонкое различие между тем, чтобы говорить ассемблеру bits 32
и фактически имея процессор в 32-битном режиме. Обычно это не доставляло бы больших хлопот (кто-то другой - ОС - определил режим процессора), но в загрузочном секторе это будет!
Когда вы дойдете до фактического переключения ЦП в 32-битный защищенный режим, в этот момент - точно - вы захотите сказать Nasm bits 32
,
Много информации об этом на http://www.osdev.org/ - я рекомендую! У меня также есть пример, выложенный в группу новостей - давным-давно - Алексеем (на самом деле "Алексей" - это не ты?).
Удачи,
Фрэнк