Volgograd

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

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

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


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

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


Это старая версия ГраблеВодство/articles/AssembleInLinux/AssemblyHowtoFaq за 2005-02-10 00:47:56..

Assembly-Howto Faq


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

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


Как я могу создавать графические программы в Linux'е?


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

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

SVGALib

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

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

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

SVGAlib можно найти на http://ftp.is.co.za

Framebuffer

do it yourself graphics at SVGA res

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

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

Примеры

Xlib

Библиотеки XFree86 для приложений и разработки

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

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

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

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


Плюсы
  • очень гибкое в использовании
  • работает под X и в консоле
  • generally abstract away the video hardware a little so you can draw to a linear surface
  • множество хороших примеров
  • может быть соединено с другим 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 дебагер, он может быть использован для простого ассемблерного кода и с небольшим шаманством вы можете заставить gdb делать то, что вам надо (к сожалению, 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
Для перемещения по коду я использую следующий macro:


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

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

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

Если вы хотите использовать 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=-)





[/Category Assembler]