2015-12-03 2 views
2

Мне интересно, как печатать символ в сборке без int 0x80 и другие системные вызовы. Я делаю это для ядра. У меня есть рабочая функция печати, но я хочу написать ее в сборке, поэтому я лучше понимаю, как она работает, даже не компилируя все для сборки. Я использую QEMU. Я новичок в сборке и смог распечатать строки только с помощью системных вызовов. Я использую NASM ассемблер, и я хотел бы, чтобы выход был ELF32. Это псевдо-сборка из того, что я пытаюсь выполнить:Печатать символ без системных вызовов

section .text 
global _start 
extern magic_print_function 
_start: 
     mov edx,1;length of buffer 
     mov ecx,'c';character c to print 
     ;somehow magically print the character without specifying stdout, maybe something like the VGA buffer? 
     call magic_print_function 
+0

Вы не можете. Единственный способ рассказать ядро: «Эй, сделай это» - это системный вызов/прерывание. А на x86 это 'int 0x80'. Теперь в 'nasm' и других ассемблерах вы можете создавать * макросы * для автоматизации печати символов. Это то, что вы имели ввиду? –

+0

@ DavidC.Rankin, поэтому мне нужно было что-то сделать в c, чтобы получить его в буфере vga? Почему я не могу это сделать в сборке? –

+2

В этом разница между * real-mode * и * защищенными режимами * вычислениями. В старых 16-разрядных DOS и т. Д. У вас был прямой доступ к видеобуру. (и остальной части системы). Начиная с (я даже не помню), с переключением на компьютеры с защищенным режимом, только ядро ​​имеет доступ к видеобуру (и большинству других аппаратных средств), и вы ограничены тем, что системные вызовы говорят ядру что-то делать. Вы все еще можете делать все на ассемблере, которое вы можете делать на C, но оба имеют дело с API-интерфейсом процессора через системные прерывания. –

ответ

0

Хорошо, вы говорите, вы не хотите с. Это немного сложно, но я уверен, что это возможно.

Для начала вы хотите установить ax и dx равными 0. Затем запустите стоп на 0. Затем вы захотите загрузить видеопамять в топор. Видеопамять начинается с 0xb800. Затем сделайте то же значение, что и ax.

Загрузите ваше сообщение в переменную и поместите его в si. На этом этапе вызовите функцию, которая записывает строку в видеопамять. Эта функция состоит из более мелких функций, которые индивидуально пишут символы и перемещают курсор на одно место справа.

Как только вы получите код для записи строки, повесьте его с помощью цикла. это невероятно просто:

loop: 
    jmp loop 

Для больше, попробуйте этот http://wiki.osdev.org/Babystep4

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