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, используя ассемблер с сайта.
Ключ /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.
MASM в Visual Studio
Также MASM можно найти в папке с Visual Studio (у меня VS 10) вот здесь: C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\ml.exe.
Для того, чтобы запустить на 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.
Корректность работы программы можно проверить, произведя линковку (компоновку) объектного файла и запустив полученный файл в отладчике.
Как было сказано выше, MASM можно использовать для работы с 16-битными программами. Выполним ассемблирование (трансляцию) программы abel32.asm с помощью ассемблера MASM:
Ключ /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.
Вот ссылки на ресурсы, посвященные 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.
Корректность работы программы можно проверить в отладчике.
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)
shevmax
10.04.2017 14:31+2Я бы поспорил насчет FASM. На нем можно компилировать программы для 16/32/64 Console/GUI/SYS BIN/COFF/PE/ELF и всё это сразу и из-под Windows можно делать. Довольно мощный язык макросов. По факту не требует установки. В принципе нормальный оптимизатор встроен. Довольно много фишек по поводу структуры конечного файла.
Я бы не назвал его игрушечным, по удобству намного лучше многих других. Позволяет писать довольно полноценные программы «на коленках».
Пожалуй самым неудобством является то, что нельзя использовать сторонние lib и obj файлы. Зато довольно легкая система построения импорта, благодаря которой не требуется lib файлов для динамической компоновки с какой-нибудь dll.delvin-fil
10.04.2017 18:55+1«Искусство дизассемблирования» К.Касперски 2009 год, БХВ-Петербург.
Инфа об игрушечности весьма устарела, так что поддерживаю Вас.
Сейчас есть и х64 версия есть.
anyox
10.04.2017 20:11Согласен, то что FASM позволяет обходится без компоновщика это его один из главных минусов который и делает его «игрушечным». Еще большим недостатком FASMa является то, что он не умеет генерировать отладочную информацию абсолютно ни в каком формате.
levmorozov
10.04.2017 21:55Что значит ни в каком формате? В своем формате (FAS) умеет. И есть плагины для Иды и Оли, понимающие этот формат.
iChaos
11.04.2017 14:38Пожалуй самым неудобством является то, что нельзя использовать сторонние lib и obj файлы. Зато довольно легкая система построения импорта, благодаря которой не требуется lib файлов для динамической компоновки с какой-нибудь dll.
Не могли бы Вы пояснить, почему нельзя использовать сторонние .lib и .obj? Это же, вроде бы, обычные COFF-файлы, которые должны стандартным образом обрабатываться сторонними линкерами, вместе с теми COFF, которые были созданы с помощью fasm.
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 так.
Serge78rus
10.04.2017 19:54распакуем его, в папке у нас будет бинарный файл fasm, копируем этот файл в /usr/bin или /usr/local/bin (в разных линуксах по разному).
Разве? Я всегда считал, что именно /usr/local/… предназначен для установки руками, а не пакетным менеджером.
OtherF
10.04.2017 20:33-7Я конечно боюсь быть закидан камнями, но кому сейчас может понадобиться изучать ассемблер?
shevmax
10.04.2017 20:43+2Любому программисту использующего язык компилируемые в нативный код. Особенно когда что-то падает неизвестно где и почему. К тому же отладка крешдампов при несоответствии версий отладочных символов по любому будет на уровне машинного кода. Еще (хоть и узкоспециализированно) оптимизация быстродействия. Особенно если язык не имеет юзать т.н intrinsic. И есть еще огромная куча довольно специализированных тем, где без ассемблера не обойтись.
alexoron
10.04.2017 23:21Например исправить баги в чужой программе без исходников. Особенно это полезно когда разработка давно прекратилась.
omegicus
10.04.2017 21:11Крис (земля ему пухом) конечно гуру, но про fasm он поспешил (причем когда он только начал развиваться).
Макроязык очень развит, в остальном — полный полет фантазии, ничем не ограничивающий программиста, вплоть до написания java-апплетов и генерирования картинок\музыки\чего угодно. Ни одни другой такого не позволяет.
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(второй случай, если он нужен всем в системе, а не только вам).Wedmer
11.04.2017 01:19Кое где уже используется ~/.local/bin
Erelecano
11.04.2017 01:56+1Вот не могу даже придумать зачем ~/.local/bin кто-то мог породить. Есть канонический ~/bin для пользовательских бинарников(у меня вот в нем Telegram лежит, потому что мне лень его в пакет завернуть). Зачем порождать еще что-то в голову не приходит.
demser
14.04.2017 09:01Появилась мысль поставить Kolibrios (с целью ознакомления с данной ОС и Fasm) на какой-нибудь бюджетный телефон или планшет или мини-пк, вот только все бюджетные телефоны/планшеты работают на ARM. Где-то читал, что есть эмулятор x86 под ARM. Подскажите, как называется. Можно, конечно, старый ПК на x86 для этих целей купить, но со старым железом связываться не охота. Может есть какие-нибудь доступные (не для работы, а для экспериментов) устройства/аппаратные платформы на Intel'e?
Erelecano
14.04.2017 15:01Поставьте в виртуалку, точно помню, что в KVM оно прекрасно запускается. Зачем придумывать себе проблемы?
sumanai
14.04.2017 16:05Подскажите, как называется.
Bosch и называется. Я там Win95 запускал на своём старичке SGS2.
lieff
yasm не хватает, тоже кросс платформенный. Большинство больших проектов поддерживают его и nasm.