Volgograd

Волгоград Linux User Group

Организована 23 ноября 2002 года

Проект заморожен Птн Июл 6 02:11:14 MSD 2012


Вход:  Пароль:  

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


Assembly-Howto Faq


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

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


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


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

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

SVGALib

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

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

Минусы
  • программы требуют права суперпользователя для их запуска, так как работают непосредственно с «железом»
  • работает не совсеми chipset'ами.
  • не работают под X-Window

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

Framebuffer

do it yourself graphics at SVGA res

Плюсы
  • быстрота работы
  • linear mapped video access, это можно использовать, если надо

Минусы
  • должно быть вкомпилировано в ядро
  • код зависит от конкретного chipset'а
  • запускается не под X-сервером
  • предполагает хорошее знание системных вызовов ядра linux'а
  • код сложен для debug'а.

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

Xlib

Библиотеки XFree86

Плюсы
  • полный контроль через ваше X приложение

Минусы
  • сложны в изучении
  • с ними ужасно работать, требует высокого знания того как работает X сервер на низком уровне

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

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


Плюсы
  • очень гибкое в использовании
  • работает под X и в консоле
  • абстрагированы от видео «железа», так что можно сразу оперировать линейными поверхностями
  • множество хороших примеров
  • может быть соединено с другим API, например с Open Gl? и звуковыми библиотеками
  • Windows Direct X? versions for free

Минусы
  • Not as fast as doing it yourself, often in development so versions can (and do) change frequently

Примеры
  • PTC и GGI обладают превосходными примерами, SDL используется sdlQuake, Myth II, Civ CTP и Clanlib так же используется при написании игр.

High-level APIs: OpenGL


Плюсы
  • ясное API 
  • тонны примеров
  • промышленный стандарт

Минусы
  • hardware acceleration должно имется у карточки
  • могут быть различия между версиями и платформами

Примеры

Для начала стоит взглянуть на примеры 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=-)