Я сейчас создаю свою собственную операционную систему.Поскольку в какой-то момент я перейду в 32-битный режим, мне нужно будет печатать на экране без прерываний, поскольку их не будет.
Вот мой код:
org 0x7c00 ; add to offsets
xor ax, ax ; make it zero
mov ds, ax ; ds=0
mov ss, ax ; stack starts at 0
cld
mov ax, 0xB800 ; Ax = address of video memory
mov es, ax
xor di, di
mov si, msg ; load msg into si
call print ; call thr print function
hlt
print:
mov ah, 07h
printchar:
lodsb ; Hear we load a letter from si
stosw
cmp al, 0
je done
jmp printchar
done:
ret ; return
msg db "Hello, World", 0 ; msg = 'test'
xpos db 0
ypos db 0
times 510-($-$$) db 0 ; make sure file is 510 bytes in size
dw 0xaa55 ; write boot signiture
При просмотре документации я знаю, что для установки положения персонажа мне нужно получить position = (y_position * characters_per_line) + x_position;
.
Единственная проблема в том, что она не кажетсяработать.Даже если я добавлю один к адресу, так что это 0xB801
, он не перемещает текст на один символ.Вместо этого я получаю следующее: .
Что здесь происходит и как я должен печатать символ на новой строке, а также увеличивать позицию x на единицу?