2016-09-25 1 views
0

Здравствуйте, я просто пытаюсь напечатать 2 сообщений с использованием функций на языке ассемблера (Простая программа загрузочного сектора), Это мой код:сборки значение языка печати мусора при использовании функций в загрузочном секторе

[org 0x7c00] 

mov bx,HELLO_MSG 
call printer 


mov bx,GOODBYE_MSG 
call printer 


jmp $ 

printer: 
     pusha 
     mov ah,0x0e 
     mov al,bl 
     int 0x10 
     popa 
     ret 




HELLO_MSG: 
    db 'Hello, World',0 

GOODBYE_MSG: 
    db 'Bye User',0 

times 510-($-$$) db 0 
dw 0xaa55 

I не знаю, где я ошибаюсь, но вышеупомянутая программа печатает некоторую ценность для мусора. Может кто-нибудь помочь мне с этим, пожалуйста?

+0

Попробуйте настроить регистры сегментов, прежде чем ссылаться на значения. – fuz

ответ

2

Во-первых, AL ожидает, что символ будет напечатан, но вы даете ему младший байт указателя на адрес памяти, где хранится первый байт текста.

Во-вторых, функция 0x0e печатает один символ только в AL, поэтому для печати всей строки вы должны перебирать ее.

В-третьих, BX не лучший регистратор для хранения указателя строки. Лучше использовать SI.

Имея все, что

pusha 
    mov ah, 0x0e 
__continue: 
    mov al, [si] 
    inc si 
    test al, al ; terminating null reached? 
    jz __ret  ; yes, exit 
    int 0x10 
    jmp __continue 
__ret: 
    popa 
    ret 

mov al, [si]/inc si может быть изменен на lodsb для меньшего размера кода

+0

ThankYou и что означает si? – KeyStroke

+1

SI - это еще один регистр общего назначения (регистр индекса источника). Вместе с DI (Destination Index) он используется для адресации исходных и целевых операндов в некоторых инструкциях типа LODSB. Вы должны определенно потратить некоторое время на теорию;) –

+0

Да, я только начал учиться – KeyStroke

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