Вызов ассемблерных функций в Nasm

В настоящее время я работаю над созданием простой ОС с нуля, поэтому я тестирую код загрузочного сектора и моделирую его с помощью Qemu.

Мой код загрузочного сектора должен печатать «A» при загрузке ОС.

Вот первая версия кода загрузочного сектора (без использования вызова функции)

[org 0x7c00]

mov al,'A'
mov ah,0x0e  ; int 10/ ah = 0eh -> scrolling teletype BIOS routine
int 0x10

jmp $

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

после выполнения бинарного файла, созданного nasm с помощью:

qemu-system-i386 test.bin

результат правильный, и символ «А» появляется там, где он должен быть

но после попытки использовать функцию, которая печатает символ, хранящийся в al, на экране ничего не печатается.

вот вторая версия файла test.asm (на этот раз включая вызов функции)

[org 0x7c00]

mov al,'A'

call my_print_function

jmp $

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


my_print_function:
    pusha  ; push all registers

    ; same code as the first version to print a character stored in al
    mov ah,0x0e  
    int 0x10

    popa ; pop all registers
    ret

так почему он не работает правильно?

Любая помощь будет принята с благодарностью.

Спасибо


person hshihab    schedule 20.04.2013    source источник
comment
Вы поместили свою функцию после конца вашей программы! (512 байт, которые загрузит BIOS). Переместите его вверх перед строкой times...   -  person Frank Kotler    schedule 20.04.2013


Ответы (1)


Вы должны иметь подпись загрузочного сектора в его конце. Я про эту часть:

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

Прямо сейчас ваш my_print_function выходит за пределы загрузочного сектора и даже не загружается BIOS.

Вам нужно переместить эту функцию перед подписью.

person Alexey Frunze    schedule 20.04.2013
comment
Можете ли вы показать мне, как заставить ту же функцию печатать строку вместо одного символа? - person goodbytes; 20.01.2015
comment
@bhargav Ваш вопрос здесь неуместен. Сделайте отдельный вопрос. Или еще лучше погуглите туториалы по сборке и сначала изучите их. - person Alexey Frunze; 20.01.2015