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

    @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, но сами мнемоники как и коды операций естественно другие.
    Дизассемблер как должно быть понятно из названия превращает коды операций в мнемоники, иногда анализируя код глобально, разделяя на процедуры, находя их вызовы или даже сопоставляя со структурами и массивами. Синтаксис тут на выбор разработчика дизассембера.
    Ответ написан
    2 комментария