Перевод с НАСМ на ГАЗ
Как мне перевести mov [ebx], al
от НАСМ к ГАЗУ? Я старался mov %al, (%ebx)
но это делает ошибку сегментации.
Другой вопрос, допустим, у меня есть массив в ГАЗ .lcomm array, 50
Должен ли я поставить знак доллара ($) в array
как это: mov %rbx, $array
или не нужно?
Любой ответ будет полезен:)
4 ответа
Как насчет intel2gas?
usage: intel2gas [options] [-o outfile] [infile]
where options include:
-h this help
-i convert from intel to at&t format (default)
-g convert from at&t to intel format
-m -t convert from masm/tasm to at&t format
-c understand C style comments
-I convert inline assembler (intel to at&t only)
-d output all % chars as %%
-V show version
infile and outfile default to stdin/stdout
Соберите с NASM, разберите с objdump -d
чтобы получить синтаксическую версию AT&T для любой отдельной инструкции.
Или используйте Agner Fog's objconv
разобрать на .S
файл с синтаксисом GAS AT&T, который вы можете собрать напрямую. (это ставит метки на ветви целей). Тем не менее, он по-прежнему не обрабатывает преобразование данных, в основном код, я думаю.
Кстати, с газом вы можете использовать .intel_syntax noprefix
, но это MASM-стиль, а не NASM, поэтому mov eax, symbol
это нагрузка, а не mov
Непосредственный адрес. (Вам нужно mov eax, OFFSET symbol
в ГАЗ .intel_syntax
). См. https://stackru.com/tags/intel-syntax/info для получения дополнительной информации о различиях между NASM и MASM.
mov [ebx], al
а также mov %al, (%ebx)
одни и те же инструкции: однобайтовое хранилище al
с использованием ebx
один как адрес. Если это ошибка, то сама по себе инструкция не является проблемой. Либо другие инструкции неверны, либо у вас другая проблема. Возможно, вы собрали свой код GAS как 64-битный? Сборка 32-битных двоичных файлов в 64-битной системе (набор инструментов GNU).
Вы можете использовать objdump (otool на osx), чтобы разобрать в газовый формат.
Сначала, mov %al, %ecx
не могу действительно ошибаться, потому что это не доступ к памяти. Черт, он даже не должен собираться, потому что они разного размера. Тем не менее, правильный перевод вашего NASM-кода mov %al, (%ecx)
который напишет al
в память по адресу ecx
,
Для другого вопроса: вам нужно $
если вы хотите сослаться на адрес. В качестве таких, mov %rbx, $array
неверно, потому что вы не можете назначить адрес. Если вы хотите хранить rbx
в первый элемент массива, напишите mov %rbx, array
, Если вы хотите загрузить первый элемент, используйте mov array, %rbx
, Если вы хотите загрузить адрес первого элемента, сделайте mov $array, %rbx
или использовать lea
который особенный и не нуждается в $
,