2013-03-17 4 views
3

У меня есть простая программа на языке ассемблера x86. Он должен печатать строку непосредственно в видеопамяти без ОС.Печать строки без ОС

[bits 16] 
[org 0x7c00] 
mov ax, 0x3 
int 0x10 
sdl 
mov ax, 0xb800 
mov es,ax 
mov si, msg 
xor di, di 
repnz movsw 
jmp $ 
msg db 'Hello' 
times 510 - ($ - $$) db 0 
dw 0xaa55 

Но это не сработает. Вы можете мне помочь?

ответ

4

Есть некоторые вопросы:

  1. Там нет такой инструкции, как sdl.

  2. Для копирования данных, вы должны использовать rep movsw, а не repnz movsw.

  3. Вам необходимо установить cx до rep movsw.

  4. Вам необходимо определить цвета каждого символа в каждом другом байте видеопамяти либо в данных, которые нужно скопировать с помощью 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 
+0

Большое спасибо. Но есть ли какие-то проблемы, которые помогают мне печатать строку, если я не знаю ее длины? (без использования команд «cmp» и «jmp»)? – Vanzef

+0

@Vanzef Извините, не могли бы вы уточнить? Какие проблемы вы имеете в виду? Вы хотите распечатать строку ASCIIZ (нулевую строку ASCII) или что-то еще? Если мой вопрос решает ваш первоначальный вопрос, отметьте его как принятый ответ (зеленая метка станет видимой), а затем опубликуйте новый вопрос о проблемах, которые не охвачены текущим вопросом. – nrz

0

С префиксом repnz вы должны сначала установить регистр cx на счетчик символов, и, как указывает nrz, вы не должны использовать его, поскольку он останавливается, когда встречается нуль.

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

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