Разработка на ассемблере в Linux

    Вообще программирование на ассемблере в Linux мало распространено и занимаются им, разве что, фанаты ассемблера. Сегодня мы и поговорим о программировании на ассемблере и инструментарий.Что нам понадобится:
    • FASM. Берем на flatassembler.net версию для Linux
    • ald. Берем на ald.sourceforge.net
    • shed. Берем на shed.sourceforge.net
    • ld. Есть в большинстве дистрибутивов

    Собственно каждый для себя выбирает инструменты сам. Я выбрал для себя эти.

    Установка FASM


    После загрузки архива с офф. сайта распакуем его:

    tar zxvf fasm-1.69.11.tgz

    В папке у нас будет бинарный файл fasm, который мы можем использовать для компиляции. Для удобства вы можете создать симлинк на него:

    sudo ln -s /home/username/fasm/fasm /usr/local/bin

    ald и shed устанавливаются не сложнее:

    $ ./configure
    $ make
    # make install


    В итоге у нас будет 3 полезных инструмента для программирования на ассемблере.

    Системные вызовы


    Как и большинство других операционных систем, Linux предоставляет т.н. API — набор полезных для программиста функций. В большинстве случаев вызов системной функции производится с помощью прерывания 80h. Следует отметить, что Linux используется fastcall-конвенция передачи параметров. Согласно ей параметры передаются через регистры (в windows, например, используется stdcall, где параметры передаются через стек). Номер вызываемой функции кладется в eax, а параметры в регистры:

    Номер параметра / Регистр

    1 / ebx
    2 / ecx
    3 / edx
    4 / esi
    5 / edi
    6 / ebp

    Как видите все не так сложно. Узнать номер системной функции, ее описание и параметры можно, хотя бы здесь. Возьмем, к примеру sys_exit. Как можно увидеть на той странице у нее есть один параметр — код возврата и она имеет порядковый номер 1. Таким образом мы можем вызвать ее следующим кодом:

    mov eax, 1 ; 1 - номер системной функции
    sub ebx, ebx ; Обнуляем регистр (можно было записать mov ebx, 0)
    int 80h ; Вызываем прерывание 80h


    Надеюсь, что все понятно.

    Hello, World!


    Ну что же. Писать мы ничего не будем, т.к. за нас все написано :) В папке fasm/examples/elfexe есть файл hello.asm, в котором находится следующий код:

    ; fasm demonstration of writing simple ELF executable

    format ELF executable 3
    entry start

    segment readable executable

    start:

    mov eax,4
    mov ebx,1
    mov ecx,msg
    mov edx,msg_size
    int 0x80

    mov eax,1
    xor ebx,ebx
    int 0x80

    segment readable writeable

    msg db 'Hello world!',0xA
    msg_size = $-msg


    Как видите здесь вызываются 2 системных функции — sys_write (с порядковым номером 4) и sys_exit. sys_write принимает 3 параметра — дескриптор потока вывода (1 — stdout), указатель на строку и размер строки. Сам номер функции, как уже говорилось, мы должны положить в eax. Функцию sys_exit мы уже разобрали. Скомпилировать это чудо можно так: fasm hello.asm (но не обязательно, т.к. там же, где лежит исходник, есть и бинарник).

    Посмотрим, что внутри


    Думаю, что самое время заглянуть в наш бинарник. Для начала воспользуемся шестнадцатеричным редактором, чтобы посмотреть что у нас получилось. Выполним команду:

    shed hello

    image

    Мы видим всю нашу программу, данные, elf-заголовок. Неплохо? Теперь мы посмотрим на нашу программу в отладчике. Наберем в консоли:

    ald hello

    Нас должна поприветствовать строка с предложением ввести команду. Список команд вы можете узнать, набрав help или получить помощь по отдельной команде, набрав help command. Дизассемблировать нашу программу можно командой disassemble (или ее алиас — "d"). Вы увидете дизассемблированный листинг вашей программы. Слева — адрес, справа — сама команда, а посередине — опкод команды.

    Получить дамп можно командой dump (странно, но ее нет в выводе команды help).

    image

    Теперь попробуем поработать с командой next. Выполните ее и в ответ вам покажут значения регистров, установленные флаги, а так же адрес, опкод и дизассемблированную команду, которая должна выполниться следующей. Попробуйте выполнять команды и следите за изменением флагов и регистров. После вызова первого прерывания у вас на экране должна появиться надпись «Hello world!».

    Целью данной статьи было показать основы программирования на ассемблере в linux, а не программирования на ассемблере в общем. Надеюсь, что вы подчерпнули для себя что-то полезное от сюда.

    PS. Первая статья на хабре.

    Полезные ссылки


    asm.sourceforge.net
    www.int80h.org
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 19

      +2
      www.wasm.ru/publist.php?list=28
      там написано намного больше и намного компетентнее имхо.
        0
        Намного больше и интереснее по ссылкам, которые я написал в конце.
        +2
        а чего не as/gdb/elfread/objdump?
          –1
          да и про fasm тоже странновато…
          в большинстве дистрибов есть nasm!
          0
          А я в начале написал:
          Собственно каждый для себя выбирает инструменты сам. Я выбрал для себя эти.

          Лично мне с тем же ald работать удобнее, чем с gdb/его gui-обертками. Функций ald мне пока вполне хватает.
            –1
            Я это спрашиваю потому, что мне три первых названия совсем незнакомы. И непонятно как вы на них напали и в чём их плюсы.

            Я пока вижу только минусы: например, ald.sourceforge.net говорит, что его последний релиз — 2004 года; fasm и ald — только x86.
              –1
              Насчет FASM — он для x86 и x86-64 (смотрим на офф. сайте или вики).
              FASM (Flat Assembler) is a free and open source Intel-style assembler supporting the IA-32 and x86-64 architectures.

              Синтаксис fasm очень похож на nasm. Странно, что вы про него не слышали. Это один из самых популярных ассемблеров с intel-синтаксисом (masm, nasm, fasm, tasm уже не актуален под x86).

              Насчет ald — это я знаю. Но, если проект обновлен последний раз в 2004 году, то это не значит, что им нельзя пользоваться.

              Просто я выбрал, чем мне удобно пользоваться. Я же никого не заставляю ими пользоваться. Если вам удобно пользоваться перечисленными вами инструментами, то я только за вас рад.
                +1
                Ну ладно, удобно так удобно. Столкнётесь с ARM/PPC/MIPS — будете привыкать к другим инструментам.

                По части x86: на мой взгляд x86_64 это всё та еще система команд. За время учёбы три раза расширял своё представление об x86: 8086 -> 80286 (защищённый режим) -> 80386 (32 бита, виртуальная память) -> pentium (чередование команд, msr), так что появление x86_64 воспринял как естественный шаг в этой цепочке.
          • НЛО прилетело и опубликовало эту надпись здесь
              0
              Затем же, зачем и на других ОС.
              • НЛО прилетело и опубликовало эту надпись здесь
                  0
                  Wikipedia >> Язык ассемблера >> Применение.
                  • НЛО прилетело и опубликовало эту надпись здесь
                      0
                      Я вообще не видел в своем городе живого программиста на ассемблере (наверняка они есть, но я их не знаю). Ассемблер — вообще непопулярный язык и пользуются им довольно редко. А пишут программы полностью на ассемблере — тем более (обычно используют ассемблерные вставки). Разве, что для того, чтобы лучше понять архитектуру компьютера. Мест, где нужно писать код только на ассемблере очень мало.
                      • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          Именно. Сейчас изучаю программирование микроконтроллеров avr на ассемблере. Для работы у меня есть Python + сейчас изучаю java, хотя пока большинство заказов на уже ненавистном php. А ассемблер для себя. Пока в жизни ассемблер пригодился только, когда старшекурсникам(цам :)) делал лабы.
                            0
                            Плюс программирование на ассемблере не позволяет засохнуть мозгу.
                            • НЛО прилетело и опубликовало эту надпись здесь
                                0
                                А причем здесь питон? Я в общем. Так же, как преподователи говорят, что математика полезна. Это же не значит, что русский язык сушит мозг.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое