В данной статье я хочу рассмотреть вопросы, которые могут возникнуть у человека, приступившего к изучению ассемблера, связанные с установкой различных трансляторов и трансляцией программ под Windows и Linux, а также указать ссылки на ресурсы и книги, посвященные изучению данной темы.

MASM


Используется для создания драйверов под Windows.

По ссылке переходим на сайт и скачиваем пакет (masm32v11r.zip). После инсталляции программы на диске создается папка с нашим пакетом C:\masm32. Создадим программу prog11.asm, которая ничего не делает.

.586P
.model flat, stdcall 
_data segment 
_data ends
_text segment
start:
ret   
_text ends
end start

Произведём ассемблирование (трансляцию) файла prog11.asm, используя ассемблер с сайта.

image
Ключ /coff используется здесь для трансляции 32-битных программ. Как сказано в Википедии, «MASM — один из немногих инструментов разработки Microsoft, для которых не было отдельных 16- и 32-битных версий.»

Также ассемблер версии 6. можно взять на сайте Кипа Ирвина kipirvine.com/asm, автора книги «Язык ассемблера для процессоров Intel».

Кстати, вот ссылка на личный сайт Владислава Пирогова, автора книги “Ассемблер для Windows”.

MASM с сайта Microsoft

Далее скачаем MASM (версия 8.0) с сайта Microsoft по ссылке. Загруженный файл носит название «MASMsetup.exe». При запуске этого файла получаем сообщение -«Microsoft Visual C++ Express Edition 2005 required».

Открываем этот файл архиватором (например 7zip). Внутри видим файл setup.exe, извлекаем его, открываем архиватором. Внутри видим два файла vc_masm.msi,vc_masm1.cab. Извлекаем файл vc_masm1.cab, открываем архиватором. Внутри видим файл FL_ml_exe_____X86.3643236F_FC70_11D3_A536_0090278A1BB8. Переименовываем его в файл fl_ml.exe, далее, произведём ассемблирование файла prog11.asm, используя ассемблер fl_ml.exe.

image

MASM в Visual Studio

Также MASM можно найти в папке с Visual Studio (у меня VS 10) вот здесь: C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\ml.exe.

image

Для того, чтобы запустить на 32- или 64-разрядной системе и создавать программы, работающие как под 32-, так и под 64-разрядной Windows, подходит MASM32 (ml.exe, fl_ml.exe). Для того, чтобы работать на 32- и 64-разрядных системах и создавать программы, работающие под 64-разрядной Windows, но неработающие под 32-разрядной нужен ассемблер ml64.exe. Лежит в папке C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\amd64 и вот здесь — C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\x86_amd64.

TASM


Программный пакет компании Borland, предназначенный для разработки программ на языке ассемблера для архитектуры x86. В настоящее время Borland прекратила распространение своего ассемблера.

Скачать можно, например, здесь. Инсталлятора нет, просто извлекаем программу. Вот исходник из книги Питера Абеля (рис. 3.2) «Язык Ассемблера для IBM PC и программирования».

stacksg segment para stack 'stack'
    db 12 dup ('stackseg')
stacksg ends
codesg segment para 'code'
begin proc far
 assume ss:stacksg,cs:codesg,ds:nothing
 push ds
 sub ax,ax
 push ax
 mov ax, 0123h
 add ax, 0025h
 mov bx,ax
 add bx,ax
 mov cx,bx
 sub cx,ax
 sub ax,ax
 nop
 ret
begin endp
codesg ends
 end begin

Выполним ассемблирование (трансляцию) файла abel32.asm.

image

Корректность работы программы можно проверить, произведя линковку (компоновку) объектного файла и запустив полученный файл в отладчике.

Как было сказано выше, MASM можно использовать для работы с 16-битными программами. Выполним ассемблирование (трансляцию) программы abel32.asm с помощью ассемблера MASM:

image

Ключ /coff здесь не используем.

FASM


В статье Криса Касперски [RIP Мыщъх] «Сравнение ассемблерных трансляторов» написано, что «FASM — неординарный и весьма самобытный, но увы, игрушечный ассемблер. Пригоден для мелких задач типа „hello, world“, вирусов, демок и прочих произведений хакерского творчества.»

Скачаем FASM с официального сайта. Инсталлятора нет, просто извлекаем программу. Откроем fasm editor — C:\fasm\fasmw.exe. В папке C:\fasm\EXAMPLES\HELLO есть файл HELLO.asm.

include 'win32ax.inc' 
.code
  start:
 invoke    MessageBox,HWND_DESKTOP,"Hi! I'm the example program!",invoke GetCommandLine,MB_OK
    invoke    ExitProcess,0
.end start

Откроем файл HELLO.asm из fasmw.exe. Изменим строку include 'win32ax.inc' на строку include 'c:\fasm\INCLUDE\WIN32AX.INC'. Запускаем из меню Run > Run.

image

Вот ссылки на ресурсы, посвященные FASM:

> FASM на Cyberforum'е
> FASM на asmworld
> Цикл статей «Ассемблер под Windows для чайников»
> Сайт на narod'е

FASM в Linux

Для того, использовать FASM в Linux (у меня Ubuntu), скачаем соответствующий дистрибутив (fasm-1.71.60.tgz), распакуем его, в папке у нас будет бинарный файл fasm, копируем этот файл в /usr/local/bin для того, чтобы можно было запускать его из консоли, как любую другую команду.Выполним ассемблирование программы hello.asm из папки fasm/examples/elfexe/hello.asm.

image

Корректность работы программы можно проверить в отладчике.

Nasm


Nasm успешно конкурирует со стандартным в Linux- и многих других UNIX-системах ассемблером Gas.

Nasm в Linux можно установить его с помощью менеджера пакетов программного обеспечения с графическим интерфейсом, команды yum install nasm, apt-get install nasm или любой другой команды, актуальной для вашего дистрибутива. Создадим программу, которая 5 раз выводит сообщение “Hello”. Пример взят из книги Андрея Викторовича Столярова “Программирование на языке ассемблера NASM для ОС UNIX”. Учебник, а также библиотека “stud_io.inc” есть на личном сайте автора.

%include "stud_io.inc"
global _start
section .text
_start: mov eax, 0
again:  PRINT "Hello"
PUTCHAR 10
inc eax
cmp eax, 5
jl again
FINISH

Выполним ассемблирование и линковку и запустим файл hello.asm.

$ nasm -f elf hello.asm
$ ld hello.o -o hello
$ ./hello

NASM для Windows

NASM для Windows можно установить, скачав соответствующий дистрибутив с соответствующего сайта.

Ссылки на ресурсы, посвященные Nasm:

> Сайт А.В. Столярова
> Сайт, на котором лежит электронный учебник (в архиве)
> То же самое

AS


Стандартный ассемблер практически во всех разновидностях UNIX, в том числе Linux и BSD. Свободная версия этого ассемблера называется GAS (GNU assembler). Позволяет транслировать программы с помощью компилятора GCC.

Из учебников удалось найти только книгу на английском «Programming from the ground up». На русском удалось найти только одну главу из книги С. Зубкова «Assembler для DOS, Windows и UNIX».

Возьмем пример программы, которая ничего не делает, с сайта. Создадим программу gas.s

.section .text
   .globl _start
   _start:
      movl  $1, %eax
      movl  $2, %ebx
      int   $0x80

Выполним ассемблирование (трансляцию), линковку и запуск программы:

$ as -o gas.o gas.s
$ ld -o gas gas.o
$ ./gas

Если в данной программе изменить _start на main, то можно выполнить ассемблирование (трансляцию) и линковку компилятором gcc.

.section .text
   .globl main
   main:
      movl  $1, %eax
      movl  $2, %ebx
      int   $0x80

Выполним ассемблирование (трансляцию), линковку и запуск программы:

$ gcc gas.s -o gas
$ ./gas

Выводы: если вы изучаете программирование под Windows, то вы можете остановить свой выбор на Masm; Tasm больше не поддерживается, но для обучения по старым классическим учебникам подойдёт.

Под Linux Gas подойдет тем, кто использует GCC, а тем, кому не нравится синтаксис Gas, подойдёт Nasm.
Поделиться с друзьями
-->

Комментарии (25)


  1. lieff
    10.04.2017 14:13
    +2

    yasm не хватает, тоже кросс платформенный. Большинство больших проектов поддерживают его и nasm.


  1. shevmax
    10.04.2017 14:31
    +2

    Я бы поспорил насчет FASM. На нем можно компилировать программы для 16/32/64 Console/GUI/SYS BIN/COFF/PE/ELF и всё это сразу и из-под Windows можно делать. Довольно мощный язык макросов. По факту не требует установки. В принципе нормальный оптимизатор встроен. Довольно много фишек по поводу структуры конечного файла.

    Я бы не назвал его игрушечным, по удобству намного лучше многих других. Позволяет писать довольно полноценные программы «на коленках».

    Пожалуй самым неудобством является то, что нельзя использовать сторонние lib и obj файлы. Зато довольно легкая система построения импорта, благодаря которой не требуется lib файлов для динамической компоновки с какой-нибудь dll.


    1. svistkovr
      10.04.2017 16:49
      +1

      Даже больше — на Fasm пишут ОС.


    1. MacIn
      10.04.2017 17:06
      +1

      FASM круче всех. Проблема в модульности.


    1. delvin-fil
      10.04.2017 18:55
      +1

      «Искусство дизассемблирования» К.Касперски 2009 год, БХВ-Петербург.
      Инфа об игрушечности весьма устарела, так что поддерживаю Вас.
      Сейчас есть и х64 версия есть.


    1. anyox
      10.04.2017 20:11

      Согласен, то что FASM позволяет обходится без компоновщика это его один из главных минусов который и делает его «игрушечным». Еще большим недостатком FASMa является то, что он не умеет генерировать отладочную информацию абсолютно ни в каком формате.


      1. levmorozov
        10.04.2017 21:55

        Что значит ни в каком формате? В своем формате (FAS) умеет. И есть плагины для Иды и Оли, понимающие этот формат.


        1. MacIn
          11.04.2017 19:41

          Начиная с 1.67.29, т.е. года с 2010.


          1. MacIn
            11.04.2017 19:45

    1. iChaos
      11.04.2017 14:38

      Пожалуй самым неудобством является то, что нельзя использовать сторонние lib и obj файлы. Зато довольно легкая система построения импорта, благодаря которой не требуется lib файлов для динамической компоновки с какой-нибудь dll.
      Не могли бы Вы пояснить, почему нельзя использовать сторонние .lib и .obj? Это же, вроде бы, обычные COFF-файлы, которые должны стандартным образом обрабатываться сторонними линкерами, вместе с теми COFF, которые были созданы с помощью fasm.


  1. mas
    10.04.2017 18:55
    +1

    Гнушный ассемблер знает и синтаксис интела:

    gcc -S -masm=intel HelloWorld.c -o hw.s

    Во первых строках файла hw.s будет директива:

    .intel_syntax noprefix

    При её наличии в ком. строке при ассемблировании опцию -masm=intel можно уже не указывать:

    gcc hw.s -o hw.exe

    По крайней мере в cygwin так.


  1. Serge78rus
    10.04.2017 19:54

    распакуем его, в папке у нас будет бинарный файл fasm, копируем этот файл в /usr/bin или /usr/local/bin (в разных линуксах по разному).

    Разве? Я всегда считал, что именно /usr/local/… предназначен для установки руками, а не пакетным менеджером.


  1. OtherF
    10.04.2017 20:33
    -7

    Я конечно боюсь быть закидан камнями, но кому сейчас может понадобиться изучать ассемблер?


    1. shevmax
      10.04.2017 20:43
      +2

      Любому программисту использующего язык компилируемые в нативный код. Особенно когда что-то падает неизвестно где и почему. К тому же отладка крешдампов при несоответствии версий отладочных символов по любому будет на уровне машинного кода. Еще (хоть и узкоспециализированно) оптимизация быстродействия. Особенно если язык не имеет юзать т.н intrinsic. И есть еще огромная куча довольно специализированных тем, где без ассемблера не обойтись.


    1. alexoron
      10.04.2017 23:21

      Например исправить баги в чужой программе без исходников. Особенно это полезно когда разработка давно прекратилась.


  1. omegicus
    10.04.2017 21:11

    Крис (земля ему пухом) конечно гуру, но про fasm он поспешил (причем когда он только начал развиваться).
    Макроязык очень развит, в остальном — полный полет фантазии, ничем не ограничивающий программиста, вплоть до написания java-апплетов и генерирования картинок\музыки\чего угодно. Ни одни другой такого не позволяет.


  1. alexoron
    11.04.2017 00:24

    Tasm Visual без проблем запускается и в десятке


  1. Erelecano
    11.04.2017 00:52
    -1

    > копируем этот файл в /usr/bin или /usr/local/bin (в разных линуксах по разному)

    Не делайте так.

    1. Не существует «разных линуксов». Linux — ядро. Бывают разные ОС и разные дистрибутивы ОС на базе ядра Linux.
    2. В /usr/bin НИКОГДА нельзя писать самому. В /usr/bin пишет пакетный менеджер. В /usr/local/bin можно собирать что-то самому. Если вы качаете бинарник, то отправляйте его в ~/bin или /opt/bin(второй случай, если он нужен всем в системе, а не только вам).


    1. Wedmer
      11.04.2017 01:19

      Кое где уже используется ~/.local/bin


      1. Erelecano
        11.04.2017 01:56
        +1

        Вот не могу даже придумать зачем ~/.local/bin кто-то мог породить. Есть канонический ~/bin для пользовательских бинарников(у меня вот в нем Telegram лежит, потому что мне лень его в пакет завернуть). Зачем порождать еще что-то в голову не приходит.


    1. demser
      11.04.2017 09:19

      Спасибо, исправил


  1. alexoron
    11.04.2017 11:28

    Автор, прикрепите ссылку на отличный ресурс: https://wasm.in


  1. demser
    14.04.2017 09:01

    Появилась мысль поставить Kolibrios (с целью ознакомления с данной ОС и Fasm) на какой-нибудь бюджетный телефон или планшет или мини-пк, вот только все бюджетные телефоны/планшеты работают на ARM. Где-то читал, что есть эмулятор x86 под ARM. Подскажите, как называется. Можно, конечно, старый ПК на x86 для этих целей купить, но со старым железом связываться не охота. Может есть какие-нибудь доступные (не для работы, а для экспериментов) устройства/аппаратные платформы на Intel'e?


    1. Erelecano
      14.04.2017 15:01

      Поставьте в виртуалку, точно помню, что в KVM оно прекрасно запускается. Зачем придумывать себе проблемы?


    1. sumanai
      14.04.2017 16:05

      Подскажите, как называется.

      Bosch и называется. Я там Win95 запускал на своём старичке SGS2.