Как перейти на новую строку в текстовом режиме сборки - PullRequest
0 голосов
/ 05 октября 2018

Я сейчас создаю свою собственную операционную систему.Поскольку в какой-то момент я перейду в 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, он не перемещает текст на один символ.Вместо этого я получаю следующее: enter image description here.

Что здесь происходит и как я должен печатать символ на новой строке, а также увеличивать позицию x на единицу?

1 Ответ

0 голосов
/ 05 октября 2018

Символы в текстовом режиме VGA составляют 2 байта;один для персонажа и один для атрибутов.+1 байт не является началом символа.

Но вы не добавляете 1 к адресу, вы добавляете 1 к базе сегмента (0xB801), поэтому вы идете вперед 16байтов или 8 символов относительно позиции 0,0 в начале памяти VGA по линейному адресу 0xB8000.

Один символ вперед будет add di,2, потому что ваш текущий код использует es: di для сохранения в VGAобъем памяти.(Или начните с mov di,2 вместо обнуления.)

Вам не придется иметь дело с сегментацией, если вы переключитесь в 32-битный защищенный режим с плоским 32-битным адресным пространством.Вы не используете никаких вызовов BIOS сейчас, так что вы могли бы.

...