Почему строка печатается только желтым, несмотря на изменение значения в 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/ - я рекомендую! У меня также есть пример, выложенный в группу новостей - давным-давно - Алексеем (на самом деле "Алексей" - это не ты?).

Удачи,

Фрэнк

Другие вопросы по тегам