Говоря о «AT & T синтаксис» по сравнению с «синтаксисом Intel», он обычно относится только к разнице между мнемониками команд и порядком и форматом операндов.
Так, например, это обучение AT & T синтаксис:
movl $1, (%esi)
и это та же команда, используя Intel синтаксис:
mov DWORD PTR [esi], 1
Для каждой инструкции, представимых в синтаксисе Intel , есть эквивалентное представление в AT & T синтаксис для этой инструкции.
Поскольку нет ассемблера AT & T и нет ассемблера Intel больше, директивы (все, кроме инструкций) - это другое дело. Ассемблер GNU (GAS) поддерживает AT & T и синтаксис Intel, но только его собственные директивы, которые являются расширением директив, используемых ассемблером AT & T. MASM от Microsoft поддерживает только синтаксис Intel, но также и его собственные директивы, которые являются расширением оригинального сборщика Intel. Не всегда есть прямой эквивалент из директив ассемблера другому ассемблеру. В некоторых случаях тот факт, что они используют разные форматы объектных файлов, может помешать найти какой-либо способ реализации функциональности директивы в другом ассемблере, используя другой формат объектного файла. (. Или даже тот же ассемблер, используя другой формат, как может быть в случае с ассемблером GNU)
В качестве примера, вот некоторые директивы ГАЗ:
.rept 3
.byte 0x90, 0x8D, 0x40, 0x00
.endr
А вот эквивалентные директивы MASM:
REPT 3
DB 90h, 8Dh, 40h, 00h
ENDM
Но нет MASM эквивалента следующей директивы GAS, потому что это специфично для формата объект ELF, который MASM не поддерживает:
.protected foo
С другой стороны, нет прямого эквивалента следующей директивы MASM, потому что ГАЗ не поддерживает сложные директивы на языке высокого уровня:
INVOKE HeapAlloc,EAX,HEAP_GENERATE_EXCEPTIONS+HEAP_ZERO_MEMORY+HEAP_CREATE_ALIGN_16,4194332
К порту бывшего ELF-специфичная директива вы бы переделать приложение, чтобы решить, как Windows обрабатывает общие библиотеки. Чтобы портировать более позднюю директиву, ориентированную на MASM, вам нужно будет создать свой собственный макрос, который выполнил бы работу по определению правильности передачи всех аргументов или просто вручную выписал все инструкции сборки, необходимые для этого вызова, в соответствии с Linux x86-64 ABI. (Вам также нужно найти подходящую функцию Linux для вызова и передачи другого набора аргументов, но это отдельная проблема при переводе самой директивы.)
Некоторые ассемблеры пытаются быть совместимыми с другими сборщиками; например, TASM Borland пытается быть совместимым с MASM, хотя это более старая версия MASM. Итак, то, что работает в TASM (в режиме MASM по умолчанию), обычно работает в MASM и наоборот. Однако многие ассемблеры используют по существу свою собственную версию ассемблера x86.
Например, код, который вы указали в своем сообщении, кажется, использует две разные версии ассемблерного языка и не может быть собран каким-либо одним ассемблером. Ваша первая строка кода использует директиву TIMES
, но эта директива поддерживается только NASM, которая не использует синтаксис AT & T или синтаксис Intel. Он имеет свой собственный синтаксис команд, хотя он не отличается от синтаксиса Intel. Он также имеет свой собственный несовместимый набор директив, не основанный ни на чем, в частности, на то, что вы указали директиву TIMES
.
Остальная часть вашего кода выглядит синтаксисом MASM. За исключением третьей строки, он не будет правильно собираться с NASM (и первая строка не будет правильно собрана с MASM). Я не уверен, собирался ли с TASM, так как директива INVOKE
была добавлена в MASM 6.
Обратите внимание, что, учитывая характер вашего кода, он, вероятно, ничего не получает, написав на ассемблере, и вы можете быть гораздо лучше перевести его на C, C++ или на другой язык, с которым вы знакомы.
Вместо 'times' вы можете использовать' .rept' или ввести его. Для остальных читайте о синтаксисе ссылки на & t memory. 'fallocate' полностью отличается от' HeapAlloc'. – Jester
Вам действительно нужен синтаксис AT & T? Не было бы намного проще переносить на газ '.intel_syntax noprefix' (который очень похож на MASM) или на синтаксис NASM? Тогда вам просто нужно будет изменить системные вызовы/ABI, а не каждую инструкцию. (См. Http://stackoverflow.com/tags/x86/info для ссылок на руководства для ассемблера) –
Так легко попасть в руки вручную, что я предлагаю собирать с помощью MASM, а затем дизассемблировать с помощью 'objdump -drwC' и переносить директивы и комментарии к разборке. Я думаю, что objdump имеет возможности получить что-то ближе к тому, чтобы быть готовым к вводу ассемблера, или использовать дизассемблер objconv от Agner Fog, который делает вывод, который может быть собран снова. –