2016-12-02 6 views
0

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

Im пытается печатать на консоль 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 
+1

Какая ценность 'DS'? – xmojmr

+1

Знаете ли вы, что код предназначен для 32-битного защищенного/нереального режима? Ваш загрузчик - это не только то, что во втором фрагменте, верно? –

+0

Поскольку вы нацеливаете код для 16-битного реального режима (ваш загрузчик не переключается в защищенный режим), вам нужно использовать 'bits 16', а не' bits 32'. Из-за причуды в способе загрузки BIOS на 386 машинах и большинстве 386 эмуляторов они заканчиваются в [нереальном режиме] (https://en.wikipedia.org/wiki/Unreal_mode). Вы должны иметь возможность использовать 32-разрядные регистры с 32-разрядными адресами для данных с 16-разрядными инструкциями. Это, конечно, не будет работать на процессоре 8086 или 80286 (и, вероятно, на некотором древнем оборудовании 80386) –

ответ

1

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

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

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

+0

В нереальном режиме 32-разрядная адресация будет работать с кэшированными дескрипторами, которые были установлены во время загрузки большинства BIOS. Я ожидаю, что его код должен работать, просто заменив «бит 32» на «бит 16» и выполнив большинство 80386 аппаратных средств (включая 386 виртуальных машин и эмуляторов). Но программирование для реального режима напрямую, как вы делаете, конечно же будет работать на 8086+, что является бонусом. –

+0

Я думаю, что у него здесь есть сапожник, так что нереальный режим на самом деле не применим. Я основываю это на его заявлении 'ORG' и в контексте того, что он пишет в коде. –

+1

Большинство 386 BIOS (включая виртуальные) загружаются в нереальный режим. До достижения загрузочного сектора они фактически переключились в защищенный режим, чтобы выполнить некоторую обработку и вернуться обратно до запуска загрузочного сектора. Многие люди этого не понимают. Ваш код не заботится о том, какой реальный режим используется (как я уже сказал, бонус). Я просто делал наблюдение, что с кодом OPs он может найти свой код, работающий как ожидалось, просто используя «бит 16». –

 Смежные вопросы

  • Нет связанных вопросов^_^