VolgogradLUG : ГраблеВодство/articles/AssembleInLinux/AssemblyHowtoFaq

Assembly-Howto Faq


Перевод кусочка Assembly-Howto сделанный мной.

Оглавление документа


Как используя ассемблер, можно написать графические программы в Linux'е?


Отвечает Paul Furber (-=paulf at icom.co.za=-)

Есть несколько вариантов. Какой из них использовать зависит от того, что вы хотите.
В сети нет сайта с информацией об этом, но вот пару советов:

SVGALib

Это C библиотека для работы с SVGA в консоли.

Плюсы
эквивалентны для gfx библиотеки DOS, все «фишки», которые вам известны из 
DOS могут быть партированы с небольшими трудозатратами.

Минусы

SVGAlib можно найти на http://ftp.is.co.za
Примечание, нету ее там. Смотрите на http://www.svgalib.org

Framebuffer

do it yourself graphics at SVGA res

Плюсы

Минусы

Примеры
Примечание, я так и не нашел сайта http://ma.verick.co.za/linux4k, и примеры с www.linuxassembly.org приводят к segfault'у. Так что если действительно надо, то надо ковырять

Xlib

Библиотеки XFree86

Плюсы

Минусы

Не рекомендуется для использования, но если вы настоящий мазохист, всегда welcome. Скорее всего заголовочные файлы и сами библиотеки уже установлены, так что можно сразу использовать.

Low-Level APIs: PTC, SDL, GGI и Clanlib


Плюсы

Минусы

Примеры

High-level APIs: OpenGL


Плюсы

Минусы

Примеры

Для начала стоит взглянуть на примеры svgalib и так же установить и настроить SDL.

Как я могу debug'нуть простой ассемблерный код под Linux'ом?


Существует сырая версия ассемблерного дебагера (http://ellipse.mcs.drexel.edu/ald.html)
которая предназначена для работы с ассемблерным кодом, она портирована под Linux и *BSD. Она вполне функциональна и ее уже можно смело использовать.

Вы можете так же попробывать gdb ;). Хотя это и source-level дебагер, он может быть использован для простого ассемблерного кода хотя и с небольшим шаманством. К сожалению, nasm '-g' ключ генерирует неправильную дебаг-информацию для gdb. (Это ошибка nasm, я думаю). Вот ответ от Dmitry Bakhvalov (-=dl at gazeta.ru=-)

Лично я использую gdb для дебага asmutils. Попробуйте так:
  1. Используйте следующий способ компилирования
    $ nasm -f elf -g smth.asm
    $ ld -o smth smth.o
  2. Запустите gdb 
    $ gdb smth
  3. В gdb:
    (gdb) disassemble _start
    Place a breakpoint at _start+1 (если поместить на метку _start не будет работать)
    (gdb) b *0x8048075
Для перемещения по коду я использую следующий macros:


Затем запустите программу по нажатию на r и дебагте с помощью n.

Надеюсь это поможет.

Дополнительная информация от ???:
Я записал такой макрос в .gdbinit и теперь жить стало проще. Небольшая поправка: Я использую «x /8i $pc», что гарантирует фиксированную длину дизассемблированных инструкций. Тогда при хорошом подборе числа для моего xterm'а, вывод gdb выглядит, как обновляемый, а не прокручиваемый.

Если вы хотите поставить breakpoints в другом месте вашего кода, то нужно просто использовать инструкцию 'int 3' как breakpoint, вместо ручного ввода адреса в gdb.

Если вы используете gas, вам надо проконсультироваться с gas и gdb мануалами tutorial'ом


Существуют ли еще какие-нибудь debug-ориентированные программы?


Наверняка strace может сильно помочь (ktrace и kdump во Free BSD), он используется для трассировки системных вызовов и сигналов. Прочтите его manual страницы (man strace) и вывод strace --help для большего понимания его возможностей.


Как я могу вызвать BIOS функции из Linux (BSD, BeOS и так далее)?


Короткий ответ — никак. Linux использует защищенный режим, попробуйте другую OS. Опять же вы не можете использовать int 0x10, int 0x13, и тому подобные вещи. К счастью почти все может быть выполнено используя системные вызовы или библиотечные функции. В самом плохом случаи вы можете использовать непосредственный port access или написать патч к ядру для внедрения нужной функциональности, или использовать LRMI библиотеку для вызова BIOS функций.


Можно ли написать модули ядра на ассемблере?


Да, дейстивтельно можно. Хотя в целом это не очень хорошая идея (это наврядле что-нибудь ускорит), хотя кому-то возмно и понадобиться такое шаманство. Сам процесс написания модуля ядра не так уж и труден — модуль должен иметь некоторую предопределенную глобальную функцию, он может так же потребовать вызова некоторых внешних функций из ядра. Посмотрите исходники ядра (что может быть собрано как модуль) для большего понимания.

Между тем, вот пример минимального модуля ядра (module.asm) (исходник которого основан на mammon_ из APJ #8):



Единственную вещь, которую делает данный модуль это сообщает, то что он делает. Измените kernel_version на свою версию ядра и соберите модуль:



Теперь вы можете поиграть с insmod/rmmod/lsmod (права суперпользователя требуются);
Наслаждайтесь.


Как мне выделить динамическую память?


Лаконичный ответ от H-Peter Recktenwald (-=phpr at snafu.de=-)



Более развернутый ответ от Tiago Gasiba (-=ee97034 at fe.up.pt=-)