Строка печати в видеопамять BIOS не работает

Итак, я использую Bochs для запуска моего загрузчика и https://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf Глава 4.1.

Я пытаюсь печатать на консоли BIOS, записывая напрямую в видеопамять, но когда я запускаю Bochs, я не вижу напечатанной строки. Код фактически идентичен коду в PDF. Что-то упускаю? Есть ли настройка Bochs, которую я забыл, или что-то, что мне не сказал PDF?

Вот файл сборки, содержащий функцию

 ;
; A simple collection of string routines for 32-bit protected mode.
;
[bits 32]
VIDEO_MEMORY equ 0xB8000
WHITE_ON_BLACK equ 0x0f         ; Color mode for the text to be written

PrintString:    ; Assume ebx holds memory address of string.
    ; edx will hold start of video memory
    ; Recall that each character written will take up 2 bytes of video memory
    ; So any particular row or column on the screen will have mem location = 0xb80000
    ; + 2 * (80r + c)

    ; The way this code is written, its always writing starting from the start of the
    ; video memory at 0xb8000, the top left of the screen, replacing everything there.

    pusha
    mov edx, VIDEO_MEMORY

    PrintLoop:
        mov al, [ebx]            ; Only ebx can be used to index
        mov ah, WHITE_ON_BLACK

        cmp al, 0
        je ExitRoutine

        mov [edx], ax

        inc ebx
        add edx, 2

        jmp PrintLoop

    ExitRoutine:
        popa
        ret

Вот моя фактическая логика загрузки.

;
; A simple boot sector program that loops forever.
;

[bits 32]
[org 0x7c00]

mov ebx, welcome_msg
call PrintString

jmp $

%include "string_utils.s"

welcome_msg db 'WELCOME TO BASICOS OMFG!', 0
goodbye_msg db 'Goodbye! Thanks for using my BasicOS!', 0

times 510 -( $ - $$ ) db 0

dw 0xaa55

person Chuck Onwuzuruike    schedule 02.12.2016    source источник
comment
Каково значение DS?   -  person xmojmr    schedule 02.12.2016
comment
Вы знаете, что код предназначен для 32-битного защищенного/нереального режима? Ваш загрузчик — это не только то, что во втором фрагменте, верно?   -  person Margaret Bloom    schedule 02.12.2016
comment
Поскольку вы нацеливаете код на 16-битный реальный режим (ваш загрузчик не переключился в защищенный режим), вам нужно использовать bits 16 , а не bits 32 . Из-за особенностей загрузки BIOS на машинах 386 и в большинстве эмуляторов 386 они оказываются в нереальном режиме. Вы должны иметь возможность использовать 32-битные регистры с 32-битными адресами для данных с 16-битными инструкциями. Это, конечно, не будет работать на процессоре 8086 или 80286 (и, вероятно, на каком-то древнем оборудовании 80386).   -  person Michael Petch    schedule 02.12.2016
comment
Мой комментарий не относится к BOCHS, хотя   -  person Michael Petch    schedule 02.12.2016
comment
Спасибо, ребята, но я понял проблему. Я неправильно переключился в защищенный режим. Теперь все в порядке.   -  person Chuck Onwuzuruike    schedule 18.12.2016


Ответы (1)


В настоящее время вы находитесь в реальном режиме, так как вы находитесь в загрузчике, поэтому вы не можете писать в него как в длинный адрес режима. Вместо этого установите DS на 0xb800, а затем используйте ebx в качестве смещения:

mov ax, 0xb800
mov ds, ax
mov bx, 0
mov [bx], 0x412e  ; A with a green background, yellow foreground

В противном случае вы пишете по смещению из того места, где в данный момент находится DS.

person David Hoelzer    schedule 02.12.2016
comment
В нереальном режиме 32-битная адресация будет работать с кэшированными дескрипторами, которые большинство BIOS настраивают во время загрузки. Я ожидаю, что его код должен работать, просто заменив bits 32 на bits 16 и работая на большинстве аппаратных средств 80386 (включая 386 VM и эмуляторы). Но программирование для реального режима напрямую, как вы делаете, конечно, будет работать на 8086+, что является бонусом. - person Michael Petch; 02.12.2016
comment
Я думаю, что у него здесь есть загрузочный сектор, поэтому нереальный режим на самом деле не применим. Я основываю это на его утверждении ORG и контексте того, что он пишет в коде. - person David Hoelzer; 02.12.2016
comment
Большинство биосов 386 (включая виртуальные) загружаются в нереальном режиме. Прежде чем достичь загрузочного сектора, они фактически переключились в защищенный режим, чтобы выполнить некоторую обработку, и вернуться до запуска загрузочного сектора. Многие этого не осознают, т. Вашему коду все равно, какой реальный режим используется (как я уже сказал, бонус). Я просто заметил, что с кодом OP он может обнаружить, что его код работает должным образом, просто используя bits 16. - person Michael Petch; 02.12.2016
comment
А, это интересно. Я не знал об этом. Спасибо. - person David Hoelzer; 02.12.2016
comment
Я понял проблему. Я неправильно переключился в защищенный режим. Теперь все в порядке. Буквально у меня ушло 15 дней, чтобы понять это. Ничего страшного, теперь я знаю. - person Chuck Onwuzuruike; 18.12.2016