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