Есть некоторые вопросы:
Там нет такой инструкции, как sdl
.
Для копирования данных, вы должны использовать rep movsw
, а не repnz movsw
.
Вам необходимо установить cx
до rep movsw
.
Вам необходимо определить цвета каждого символа в каждом другом байте видеопамяти либо в данных, которые нужно скопировать с помощью rep movsw
, либо внутри цикла копирования. Приведенный ниже код иллюстрирует оба варианта:
Edit: добавлен код.
[bits 16]
[org 0x7c00]
mov ax,3
int 10h
push word 0xb800
pop es
push cs ; just in case, for bootloader code,
pop ds ; needed for movsb
xor di,di
mov si,msg
mov cx,msg_length_in_bytes
one_color_copy_to_vram_loop:
movsb
mov al,0x0f
stosb
loop one_color_copy_to_vram_loop
mov si,multicolor_msg
mov cx,multicolor_msg_length
rep movsw
jmp $
msg db 'Hello'
msg_length_in_bytes equ $-msg
multicolor_msg db ' ',0
db 'H',1
db 'e',2
db 'l',3
db 'l',4
db 'o',5
db ' ',0
db 'w',6
db 'i',7
db 't',8
db 'h',9
db ' ',0
db 'c',10
db 'o',11
db 'l',12
db 'o',13
db 'r',14
db '!',15
multicolor_msg_length equ ($-multicolor_msg)/2
Большое спасибо. Но есть ли какие-то проблемы, которые помогают мне печатать строку, если я не знаю ее длины? (без использования команд «cmp» и «jmp»)? – Vanzef
@Vanzef Извините, не могли бы вы уточнить? Какие проблемы вы имеете в виду? Вы хотите распечатать строку ASCIIZ (нулевую строку ASCII) или что-то еще? Если мой вопрос решает ваш первоначальный вопрос, отметьте его как принятый ответ (зеленая метка станет видимой), а затем опубликуйте новый вопрос о проблемах, которые не охвачены текущим вопросом. – nrz