Задать вопрос

Как разобраться во всех этих синтаксисах ассемблера?

Здравствуйте уважаемые тостеровцы.Решил начать изучать ассемблер.Пока ищу книги и ресурсы,поймал себя на мысли,что даже не понимаю различия между всему этими ассемблерами.
GAS,MASM,TASM и остальные.У мк PIC свой асм,у AVR свой.Я просто не знаю с какого начать.GAS использует AT&T-синтаксис другие интел синтаксис.Как например реверс инженеры дизасемблируют программы?На каком ассемблере?Википедия как я понял говорил,что даже у каждой ОС есть специфичный синтаксис.Проясните немножко.Вот если например я хочу писать для процессоров x86,то для винды будет свой асм,а для linux свой?Или как?
Знаю как проще его задать.Вот если хакеры(нет я не планирую им становится даже близко,суть не в этом)пишет вирус для гипотетически двух абсолютно одинаковых компьютеров.На них одинаковые процы,все одинаковое,только на одном стоит линукс,на другом винда,получается ассемблеры будут разные,и один и тот же вирус будет для двух этих компьютеров на разных синтаксисах?
Извиняюсь заранее за очень идиотский скорее всего вопрос.
  • Вопрос задан
  • 2666 просмотров
Подписаться 7 Оценить 1 комментарий
Решения вопроса 1
@abcd0x00
Тоже путался, потом пошёл другим путём. Взял самые популярные книги по ассемблеру и установил всё, что надо для занятий по ним. Важно не самую свежую поставить, а чтобы заниматься можно было.
Получилось: Абель + DosBox + несколько трансляторов.
[guest@localhost PROGRAMS]$ ls
ASM86  HIEW_650  MASM61  TASM  TECH60
[guest@localhost PROGRAMS]$

Сейчас занимаюсь в MASM61 и TASM.
А вот TECH60 - это типа справочника по функциям операционной системы.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 6
Лучше написать программу на С/С++, а потом с помощью опции "-S" можно превратить вывод в ассемблерный код и его изучать. Второй вариант - загнать полученную программу в отладчик и изучать код там. А писать сразу на чистом Ассемблере скорее всего и не потребуется никогда. Это раньше было популярно, во времена "640К памяти хватит на всё".
Ответ написан
Во первых ассемблер - в общем случае удобоваримая запись инструкций процессора (которую человеку более менее удобно читать). Соответственно есть разные процессоры (архитектуры) как следствие различные команды, иногда даже синтаксис может несколько меняться. GAS, MASM, TASM - по сути это различные компиляторы ассемблера и отличаются форматом построения предложения (как одна и та же мысль на разных языках записывается по разному (весьма отдаленная аналогия)).
В современных ОС никто не даст программе исполняться напрямую (делать все что ей вздумается). ОС вводит ограничения какие команды сможет использовать программа... Плюс к этому формат исполняемых файлов (заголовки) у Окон и Линуха различаются. Соответственно один и тот же исполняемый файл на обеих системах не заведется.нише
Теоретически может даже получится извернуться и написать такой код в ассемблере, что он будет компилироваться в исполняемый файл для обеих систем, но параметры (целевая архитектура/ос) ассемблеру нужно будет давать разные.
Практически единственная ниша ассемблера - низкоуровневые оптимизации. Когда верблюдов через игольное ушко гоняешь.
Ответ написан
Комментировать
Foolleren
@Foolleren
Компас есть, копать не люблю...
ассемблер это почти, что язык процессора - и синтакисов очень много, потому и придумали С
чтобы разобраться с ассемблером надо читать по мимо книг ещё и датащиты к процессорам- там все тонкости,
если рассматривать ассемблер с точки зрения высокого языка программирования то у нас есть
константы
регистры (переменные)
порты
флаги
команды(функции)
память(другой тип переменной можно сказать что массив)
стэк
может чё забыл)
команды в свою очередь могут зависеть от флагов или влиять на них вот и весь вот и весь ассемблер, разница в том что в ассемблере структуру программы и типы надо держать в голове в отличии от языка высокого уровня.
Для винды и линукса разница в том, что надо вызывать разные функции ос и в заголовке исполняемого файла, в самом ассемблере разницы нет (если конечно линукс не на каком ни будь арме крутится)
Ответ написан
@none7
Суть любого ассемблера в превращении мнемоник команд в машинные коды операций(опкоды), ну и расчёт относительных смещений по именованным меткам. Сами коды операций одни и те же в рамках архитектуры процессора. Можно даже ассемблировать программу для Windows, а запускаясь в Linux Wine напрямую обращаться к системным вызовам ядра Linux. Различные ассемлеры(программы) имеют различное оформление кода, где сегменты кода, где данных и множество других малоизвестных опций, скармливаемых линкеру и ОС. MASM и TASM различаются только в этом, но можно написать и совместимый код, мнемоники команд FASM отличаются незначительно, но в целом все они используют Intel-синтаксис. То есть мнемоники команд выглядят абсолютно идентично. С GAS использующем AT&T-синтаксис несколько сложнее, мнемоники по существу те же, но каждой инструкции приставляется размер операндов и сам порядок операндов обратный. Пример расширения регистра 1 байт в 4 байта(move xxxb x=Zero):
movzx ecx, al (Intel);
movzxbl %al, %ecx (AT&T movzxb(yte)l(ong))

Обе мнемоники дадут один и тот же код операции. Ассемблеры использующие AT&T-синтаксис есть не только для x86 и amd64, но сами мнемоники как и коды операций естественно другие.
Дизассемблер как должно быть понятно из названия превращает коды операций в мнемоники, иногда анализируя код глобально, разделяя на процедуры, находя их вызовы или даже сопоставляя со структурами и массивами. Синтаксис тут на выбор разработчика дизассембера.
Ответ написан
@MiiNiPaa
Берёте ассемблер который вам нужен и изучаете его. Понадобился другой (скажем, под другую платформу или для интеграции с другой билд-системой) — учите его. Благо отличаются ассемблеры для одной платформы обычно мелочами.

Суть ассемблера — прямые команды процессору. Сколько у процессора есть различных инструкций, столько различных команд в конкретном ассемблере будет.

Если есть ассемблер под разные ОС, можно писать одинаковый код под эти ОС. Но нужно учитывать, что как только нужно будет обратится к АПИ этой ОС, тут уже придётся потрудится: какую библиотеку подгружать, как передавать аргументы и т.п.
Ответ написан
@Montgomeri
Тоже сейчас разбираюсь со всем этим. Все такое странное и непонятное. Но вот отрыла отличную книгу Столярова "Программирование на языке ассемблера NASM для ОС Unix". Там все очень просто и доступно разжевано. Советую. Ну а вообще сурсов с ответами на подобные вопросы много. Вот хорошая подборка книг: https://proglib.io/p/assembler-books/. Там и Столяров, и Калашников, и иже с ними. Все 2011 и 2014 года. Новее вообще не могу найти. К сожалению, у нас Ассемблер не пользуется такой популярностью, как хотелось бы :( Вещь ведь действительно нужная и интересная. Удачи на этом поприще!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы