MASM, TASM, FASM, NASM под Windows и Linux

Часть I
Часть II
Часть III

В данной статье я хочу рассмотреть вопросы, которые могут возникнуть у человека, приступившего к изучению ассемблера, связанные с установкой различных трансляторов и трансляцией программ под 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, используя ассемблер с сайта masm32.

image
Ключ /coff используется здесь для трансляции 32-битных программ.
Линковка производится командой link /subsystem:windows prog11.obj (link /subsystem:console prog11.obj)

Как сказано в Википедии
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

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

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

image

Ключ /coff здесь не используется.
Линковка производится файлом link16.exe

FASM


В статье Криса Касперски «Сравнение ассемблерных трансляторов» написано, что «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 .com программы под Dos
Цикл статей «Ассемблер под 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 можно установить его с помощью менеджера пакетов или из командной строки: в дистрибутиве Debian (Ubuntu) командой apt-get install nasm, в дистрибутивах Fedora, CentOS, RedHat командой yum 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

Для 64bit необходимо использовать команду nasm -f elf64 hello.asm

NASM для Windows

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

Ассемблирование:
nasm -f bin имя_файла.asm -o имя_файла.com

Ссылки на ресурсы, посвященные 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.

P.S. Следующие две части, в целом, посвящены обработке строки в цикле.
P.P.S. Little Man Computer — учебная модель компьютера с ограниченым набором ассемблерных инструкций рассматривается в этой статье.
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 27

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

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

      Пожалуй самым неудобством является то, что нельзя использовать сторонние lib и obj файлы. Зато довольно легкая система построения импорта, благодаря которой не требуется lib файлов для динамической компоновки с какой-нибудь dll.
        +1
        Даже больше — на Fasm пишут ОС.
          +1
          FASM круче всех. Проблема в модульности.
            +1
            «Искусство дизассемблирования» К.Касперски 2009 год, БХВ-Петербург.
            Инфа об игрушечности весьма устарела, так что поддерживаю Вас.
            Сейчас есть и х64 версия есть.
              0
              Согласен, то что FASM позволяет обходится без компоновщика это его один из главных минусов который и делает его «игрушечным». Еще большим недостатком FASMa является то, что он не умеет генерировать отладочную информацию абсолютно ни в каком формате.
                0
                Что значит ни в каком формате? В своем формате (FAS) умеет. И есть плагины для Иды и Оли, понимающие этот формат.
                  0
                  Начиная с 1.67.29, т.е. года с 2010.
              0
              Пожалуй самым неудобством является то, что нельзя использовать сторонние lib и obj файлы. Зато довольно легкая система построения импорта, благодаря которой не требуется lib файлов для динамической компоновки с какой-нибудь dll.
              Не могли бы Вы пояснить, почему нельзя использовать сторонние .lib и .obj? Это же, вроде бы, обычные COFF-файлы, которые должны стандартным образом обрабатываться сторонними линкерами, вместе с теми COFF, которые были созданы с помощью fasm.
              +1
              Гнушный ассемблер знает и синтаксис интела:

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

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

              .intel_syntax noprefix

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

              gcc hw.s -o hw.exe

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

                Разве? Я всегда считал, что именно /usr/local/… предназначен для установки руками, а не пакетным менеджером.
                  –7
                  Я конечно боюсь быть закидан камнями, но кому сейчас может понадобиться изучать ассемблер?
                    +2
                    Любому программисту использующего язык компилируемые в нативный код. Особенно когда что-то падает неизвестно где и почему. К тому же отладка крешдампов при несоответствии версий отладочных символов по любому будет на уровне машинного кода. Еще (хоть и узкоспециализированно) оптимизация быстродействия. Особенно если язык не имеет юзать т.н intrinsic. И есть еще огромная куча довольно специализированных тем, где без ассемблера не обойтись.
                      0
                      Например исправить баги в чужой программе без исходников. Особенно это полезно когда разработка давно прекратилась.
                      0
                      Крис (земля ему пухом) конечно гуру, но про fasm он поспешил (причем когда он только начал развиваться).
                      Макроязык очень развит, в остальном — полный полет фантазии, ничем не ограничивающий программиста, вплоть до написания java-апплетов и генерирования картинок\музыки\чего угодно. Ни одни другой такого не позволяет.
                        0
                        Tasm Visual без проблем запускается и в десятке
                          –1
                          > копируем этот файл в /usr/bin или /usr/local/bin (в разных линуксах по разному)

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

                          1. Не существует «разных линуксов». Linux — ядро. Бывают разные ОС и разные дистрибутивы ОС на базе ядра Linux.
                          2. В /usr/bin НИКОГДА нельзя писать самому. В /usr/bin пишет пакетный менеджер. В /usr/local/bin можно собирать что-то самому. Если вы качаете бинарник, то отправляйте его в ~/bin или /opt/bin(второй случай, если он нужен всем в системе, а не только вам).
                            0
                            Кое где уже используется ~/.local/bin
                              +1
                              Вот не могу даже придумать зачем ~/.local/bin кто-то мог породить. Есть канонический ~/bin для пользовательских бинарников(у меня вот в нем Telegram лежит, потому что мне лень его в пакет завернуть). Зачем порождать еще что-то в голову не приходит.
                              0
                              Спасибо, исправил
                              0
                              Автор, прикрепите ссылку на отличный ресурс: https://wasm.in
                                0
                                Появилась мысль поставить Kolibrios (с целью ознакомления с данной ОС и Fasm) на какой-нибудь бюджетный телефон или планшет или мини-пк, вот только все бюджетные телефоны/планшеты работают на ARM. Где-то читал, что есть эмулятор x86 под ARM. Подскажите, как называется. Можно, конечно, старый ПК на x86 для этих целей купить, но со старым железом связываться не охота. Может есть какие-нибудь доступные (не для работы, а для экспериментов) устройства/аппаратные платформы на Intel'e?
                                  0
                                  Поставьте в виртуалку, точно помню, что в KVM оно прекрасно запускается. Зачем придумывать себе проблемы?
                                    0
                                    Подскажите, как называется.

                                    Bosch и называется. Я там Win95 запускал на своём старичке SGS2.
                                    0
                                    Попытался на MacBook'е (Core 2 Duo Mac Os 10.6.8) выполнить трансляцию программы gas.s командой $ as -o gas.o gas.s. Получил ошибки. Потом нашел статью, где написано, что As идёт только на MacBook'e с х86, на Core 2 Duo не пойдёт. Остается Nasm?
                                      0
                                      Нет, на маке тоже вполне можно, я делаю вот так:
                                      export DEVELOPER_DIR:=/Applications/Xcode.app/Contents/Developer
                                      export AS=clang

                                      Для arm у аппла еще синтаксис свой, большие проекты вроде x264 и ffmpeg используют тулзу конвертации gas-preprocessor.pl и перегоняют gas в appl синтаксис.

                                    Only users with full accounts can post comments. Log in, please.