Компиляторы MASM, FASM, TASM — в чем их различия
День добрый.
Ребята я вот начинаю изучать язык программирования ассемблер, и и не могу понять различие между ними(уже запутался). Какой мне лучше установить? И есть ли в них существенные различия.
ОС: Windows 7 x64.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
FASM/MASM/TASM
В ентернетах очень много различных примеров для различных ассемблеров, я решил что буду изучать.
Есть ли компиляторы Tasm или Masm для 64-разрядных систем
Есть ли компиляторы Tasm или Masm для 64-разрядной с-мы. если есть просьба скинуть.

Какой компилятор выбрать FASM, MASM или TASM?
Здравствуйте. Посоветуйте мне какой компилятор лучше выбрать. FASM, MASM или TASM. Какой из них.
MASM, TASM, FASM: что выбрать для программирования в ядре
Какой асемлер выбрать для проганья в едре? вынь
![]()
Сообщение от Xank
Windows 7 x64
Из предложенных FASM.
Ушел с форума
![]()
16186 / 7520 / 1041
Регистрация: 11.11.2010
Сообщений: 13,525
Xank, если tasm в режиме совместимости с masm, то различие в оформлении процедур и структур, если masm/tasm сравнивать с fasm, то различий будет много.
Сообщение от Xank 
Какой мне лучше установить?
Устанавливай все три и пиши на них одинаковые программы, сравнивай, что из них лучше это ты сам должен определить
MASM, TASM, FASM, NASM под Windows и Linux
В данной статье я хочу рассмотреть вопросы, которые могут возникнуть у человека, приступившего к изучению ассемблера, связанные с установкой различных трансляторов и трансляцией программ под 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.

Ключ /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.

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.

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

Ключ /coff здесь не используется.
Линковка производится файлом link16.exe
Вот здесь приводится порядок действий, которые необходимо выполнить для запуска TASM в DOSbox. Для линковки понадобится файл DPMI16BI.OVL
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.

Вот ссылки на ресурсы, посвященные FASM:
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 можно установить с помощью менеджера пакетов или из командной строки: в дистрибутиве 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, которому у меня также посвящено несколько статей ссылка.
Различия FASM и MASM
Объясните разницу между ассемблерами FASM и MASM. Изучаю книгу Юрова с практическими алгоритмами на ассемблере, и решил писать их на FASM, потому что говорят, что он дает больше возможностей. Первое, что не понравилось — лишняя секция импорта с мусором внутри, без которого я обходился раньше, и необходимость ставить byte ptr там, где в MASM этого не требовалось. FASM выглядит избыточным. Наконец, простой пример из книги отрабатывает очень странно:
format PE Console 4.0 entry start include 'win32a.inc' section '.text' code readable executable start: call add_uint proc add_uint mov al, byte ptr a add al, 10 jnc end_p adc byte ptr carry, 0 end_p: ret endp exit: invoke ExitProcess, 0 section '.data' data readable writeable a db 255 b db 7 sum db 0 carry db 0 section '.idata' import data readable writeable library kernel, 'kernel32.dll' import kernel, ExitProcess, 'ExitProcess'

Отладчик показывает, что после выполнения ret в процедуре мы попадаем снова в начало процедуры, она отрабатывает второй раз, и только тогда переходим по адресу возврата. Почему так?
Отслеживать
47.5k 17 17 золотых знаков 56 56 серебряных знаков 99 99 бронзовых знаков
задан 27 фев 2016 в 12:22
2,427 2 2 золотых знака 30 30 серебряных знаков 47 47 бронзовых знаков
Вы после call явно ret поставьте. просто ваш асм сам не подставляет ret в итоге выполнение продолжается по сегменту кода, где у вас собственно процедура и находится. И лично я от ассемблера ожидаю именно такого поведения — не подставлять ничего от себя, только то что явно написано
27 фев 2016 в 12:48
То есть вот так? call add_uint ret Такого я ни в одном исходнике в интернете не видел. К тому же при этом ret оказывается вне досягаемости процессора, во всяком случае, так показывает отладчик.
27 фев 2016 в 12:51
Что значит вне досигаемости. он же в тексте идет сразу после первой инструкции, как процессор может его не выполнить
27 фев 2016 в 12:57
Добавил скрин в пост. Там даже адрес возврата остается в стеке.
27 фев 2016 в 13:00
Да, сейчас увидел. До этого не видел, потому как смотрю как процессор. В эту точку в принципе попасть невозможно. Вы делаете call попадаете в свою функцию, из нее возвращаетесь, в точку откуда был call. продолжаете двигаться по коду и опять попадаете в функцию, далее стоит ret. где переход в точку exit ? И зачем вы функицию написали между надачалом программы и точкой exit ?
27 фев 2016 в 13:06
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Первое, что не понравилось — лишняя секция импорта с мусором внутри
Когда я вижу вопросы по MASM, практически в каждом из них есть куча мусорных include . Одно поменялось на другое. На fasm можно писать и без явного указания секции импорта, если, конечно, вам не потребуется вызов функций из библиотек, не входящих в «стандартные».
Вот hello.asm из пакета fasm, как видите, ничего «лишнего»:
format PE GUI 4.0 ; example of simplified Windows programming using complex macro features include 'win32ax.inc' ; you can simply switch between win32ax, win32wx, win64ax and win64wx here .code start: invoke MessageBox,HWND_DESKTOP,"Hi! I'm the example program!",invoke GetCommandLine,MB_OK invoke ExitProcess,0 .end start
необходимость ставить byte ptr там, где в MASM этого не требовалось.
Лучше ставить квадратные скобки, тогда размер явно указывать не придется. В вашем случае обращение к переменным можно изменить на такое:
mov al, [a] . adc [carry], 0
Если обращение идет ко всей переменной, то «размер» указывать не нужно (размер определяется по размеру переменной). Если же идет обращение, например, к одному байту из переменной размера dword, то нужно указать размер byte:
mov al, byte [a] . a dd 255
Обращение по какому-то адресу в fasm обозначается через имя переменной или регистра в квадратных скобках. Я считаю, это более логично, чем то, как это делается в диалекте MASM (если адрес в регистре — то квадратные скобки, если адрес в переменной — то без них).
Просто смещение (offset) указывается как имя переменной без квадратных скобок, т.е. mov eax, offset a в диалекте fasm будет выглядеть как mov eax, a .
Наконец, простой пример из книги отрабатывает очень странно
Конечно, будет странно работать, если поставить функцию сразу после ее вызова. Код процессором выполняется линейно (пока он не встретит инструкции передачи управления). Естественно, что вернувшись после call процессор наткнется на функцию, из которой только что вернулся, и начнет выполнять ее опять.
Если упрощенно, то код самой функции нужно ставить вне кода других функций (выше или ниже, не важно), или делать jmp на метку exit непосредственно после call , раз уж вы завели такую метку, тогда «лишнего» выполнения функции add_uint не будет.
Это не специфика fasm, аналогичный код для MASM будет выполняться так же.
Ну и, наконец, рабочий пример кода на fasm. Обратите внимание, что через include подключен другой файл, который позволяет не указывать явно секцию импорта (секция импорта будет фактически добавлена макросом .end ):
format PE Console 4.0 include 'win32ax.inc' .code proc add_uint mov al, [a] add al, 10 jnc end_p adc [carry], 0 end_p: ret endp start: call add_uint invoke ExitProcess, 0 .data a db 255 b db 7 sum db 0 carry db 0 .end start
какой ассемблер лучше удобнее а главное кроссплатформенный?
Ассемблеры, имеющие версии для Windows и Linux:
NASM, FASM, YASM, JWASM, GAS, SolASM, HLA.
В Linux в плане удобства безразлично какой. Все они вызываются из командной строки. Удобство зависит от предпочитаемого синтаксиса.
В Windows удобней те, которые имеют собственные IDE или встраиваются в сторонние (FASM, JWASM, YASM), и те, которые не собирают сразу исполняемый файл, а создают только объектный, который затем компонуется линковщиком (это YASM, JWASM, GAS, NASM и при использовании соответствующих директив FASM). А также имеет значение предпочитаемый синтаксис, как и в Linux.
Для информации о «кроссплатформенности» ассемблера: http://otvet.mail.ru/answer/434788570
О синтаксисе. FASM, NASM, YASM (в intel-нотации) имеют ideal-подобный синтаксис TASM’a.
JWASM — MASM-подобный.
HLA — свой собственный.
GAS и YASM (в режиме GAS) — нотация AT&T.
Остальные ответы
fasm, без вариантов, если нужна кроссплатформенность.
с каких пор он стал кроссплатформенным?
или троллизм в голову тебе опять постучал?
маразм на асме в линуксе писать.
>или троллизм в голову тебе опять постучал?
Я так понимаю, автор вопроса имел в виду не ассемблер, который бы генерировал код под разные архитектуры из одного исходника, а который бы работал на разных платформах и/или генерировал объектные файлы в разных форматах. Так что вопрос вполне правомерный.
Помимо fasm ещё можно назвать nasm. Его, к примеру, использует программа tmux.