Перевод с НАСМ на ГАЗ

Как мне перевести 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 который особенный и не нуждается в $,

Другие вопросы по тегам