Перейти к содержимому

Какой ассемблер лучше fasm

  • автор:

Какую версию assembler учить (MASM или FASM)?

includedlibrary

MASM и FASM — это компиляторы, а не языки. Различия в коде для MASM и FASM только на уровне директив и макросов. У языка Ассемблера есть два основных диалекта — синтаксис Intel и синтаксис AT&T, а также различный набор инструкций для различных архитектур процессоров. Я рекомендую начать с эмулятора 8086 в реальном режиме и только освоив в должной мере основы, выбирать компилятор.

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

Отслеживать
48.6k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
задан 27 фев 2016 в 12:22
2,517 3 3 золотых знака 31 31 серебряный знак 49 49 бронзовых знаков

Вы после 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 

Какой ассемблер лучше fasm

Может, кто-то сможет изложить парой предложений суть нескольких ассемблеров под Windows 10 (х64), таких как MASM32 и MASM, FASM?… Можно и про другие, если что.

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

Но если существует так много ассемблеров, то какая-то причина на это есть для каждого из них. Вот про это нихрена нигде толком нет.

Так же, если с MASM32 я немного понял, что это такое, то про MASM ничего не нашёл: где его брать, актуален ли он ещё, это отдельная программа или тоже пакет из бардака разной мелочи.

Может есть документация к какому-то из них на русском. Или на английском, но обновлённая? На сайте MASM32 я вообще не понял, куда он документацию засунул. В самом пакете вроде как даже не самая свежая. Документацию из программы не предлагайте, в ней переводчики не действуют, нужно онлайн размещение, а я без переводчика пока не могу читать.

Не обучение, б@дь, а ё@ная трата времени на сплошные препятствия.

Расскажите, кто имел плотный опыт с несколькими ассемблерами, в чём их отличия, кроме названия и синтаксиса?

Регистрация: 15.02.2010
Сообщений: 15,654

А какие вам сравнения нужны? По сути все аргументация и будет на личных предпочтениях. Для старта можете взять любой Masm, Fasm или, даже, Nasm.

masm32 это пакет, который создали, когда майкрософт перестала отдельно поставлять обновленный masm. Если решите брать masm, то берите masm32, а сам компилятор поновее из студии.

Форумчанин
Регистрация: 27.07.2013
Сообщений: 256
Сообщение от p51x

А какие вам сравнения нужны? По сути все аргументация и будет на личных предпочтениях. Для старта можете взять любой Masm, Fasm или, даже, Nasm.

Осталось только определить, какой же из любого взять.

Сообщение от p51x

masm32 это пакет, который создали, когда майкрософт перестала отдельно поставлять обновленный masm. Если решите брать masm, то берите masm32, а сам компилятор поновее из студии.

Если бы и первая часть ответа была такой же конструктивной; здесь хоть можно вывести соотношение между MASM и MASM32. Спасибо и на этом.

А из студии брать только компилятор ml.exe или ещё что?

Сообщение от p51x
А какие вам сравнения нужны?

Решающим может оказаться лучшая и актуальная документация, желательно на русском или большое русскоязычное сообщество.

Получается с MASM32 без бубна никак с его старой версией компилятора и документации в доступе на сайте нет. Тут как-то на этом фоне FASM вылезает вперёд.

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

Последний раз редактировалось Andrej_K; 29.06.2019 в 03:31 .

какой ассемблер лучше удобнее а главное кроссплатформенный?

Ассемблеры, имеющие версии для 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *