2015-06-14 3 views
3

Я хочу создать функцию printl, которая позволяет мне печатать строку в регистре ax. Я работаю в 16-битном режиме, и я не могу найти способ распечатать сообщение. Я использую int 0x10 для печати одной буквы.Печать строки с использованием INT 0x10 в bootsector

Прошу передать аргумент (строка для печати) в регистре bx, затем в цикле напечатать письмо по букве, а затем вернуться с помощью popa и ret. Мой код действительно не работал - либо он создал бесконечный цикл, либо напечатал странный знак.

Если вы знаете более эффективный способ сделать это, это не проблема. Я также хотел бы спросить о комментируйте код, если вы дали какой-либо

Это мой код

boot.asm:

start: 
    mov bx, welcome ;put argument to bx 
    call printl  ;call printl function in sysf.asm 
    hlt    ;halt cpu 

welcome db 'Hello', 0 

include 'sysf.asm' 
times 510 - ($-$$) db 0 

db 0x55 
db 0xAA 

sysf.asm:

;print function 
; al is one letter argument (type Java:char) 
; 
print: 
     pusha 
     mov ah, 0x0e 
     int 0x10 
     popa 
     ret    ; go back 

;printl function 
; bx is argument of type Java:String 
; 
printl: 
     pusha 
     jmp printl001 
printl001: 
     lodsb    ; I was working with si register but i would like to use bx register 
     or al,al 
     jz printl002 
     mov ah, 0x0e 
     int 0x10 
     jmp printl001 
printl002: 
     popa 
     ret 
+0

Удивительный вопрос, у меня нет таких знаний об установке, но я бы хотел (Степень в CompSci). – coderrick

+0

Какой ассемблер вы используете? Ваш код не будет работать с TASM, он больше похож на NASM, но 'include 'sysf.asm'' также не работает с NASM. –

+0

извините мою ошибку, я использую FASM не TASM – vakus

ответ

2

lodsb инструкция загружает байт, на который указывают регистры DS и SI, но вы не загрузили ни действительное значение. Так как это загрузчик, вам также нужно использовать директиву ORG, иначе ассемблер не будет знать, где вы код, а потому welcome, загружается в память. Попробуйте изменить начало вашей программы:

ORG 0x7c00 

start: 
    push cs 
    pop ds 
    mov si, welcome 
+0

Я пробовал, но он не работал. Я ничего не распечатываю. Код printl001 был найден в Интернете, и я его не очень понимаю – vakus

+0

Обновлен мой ответ. –

+0

Это сработало. благодаря – vakus

2

Согласно documentation for BIOS INT 0x10:

выход TeleType: AH = 0Eh, AL = Character, BH = номер страницы, BL = Цвет (только в графическом режиме)

Если BH не равно нулю, он будет записывать на страницу видео, которая не отображается. Если, конечно, вы не перевернули отображение любой страницы в BH. Возможно, вы хотите изменить функцию печати:

print: 
     pusha 
     mov ah, 0x0e 
     xor bx, bx  ; BX = 0 
     int 0x10 
     popa 
     ret    ; go back 

Если ваш вывод вызывает экран для прокрутки, BPmight be destroyed, хотя это не должно стать проблемой для вашего кода, поскольку он сохраняет все регистры.

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

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