Перевод с NASM на GAS

как перевести mov [ebx], al из NASM в GAS? Я пробовал mov %al, (%ebx), но это ошибка сегментации.

Другой вопрос, скажем, у меня есть массив в GAS .lcomm array, 50 Должен ли я ставить знак доллара ($) в array вот так: mov %rbx, $array или не нужно?

Любой ответ будет полезен :)


person ThisGuy    schedule 16.09.2013    source источник
comment
Соберите с помощью NASM, разберите с помощью objdump -d (или с помощью objconv, чтобы получить файл, который вы действительно можете собрать .   -  person Peter Cordes    schedule 27.12.2017


Ответы (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
person Lain-dono    schedule 29.10.2013
comment
Intel2gas теперь живет в github: github.com/skywind3000/Intel2GAS - person vonbrand; 09.04.2018
comment
Вау... Этот инструмент ужасен. - person rgcalsaverini; 21.08.2020

Соберите с помощью NASM, разберите с помощью objdump -d, чтобы получить версию синтаксиса AT&T для любой отдельной инструкции.

Или используйте objconv Agner Fog для дизассемблирования в файл .S с синтаксисом GAS AT&T, который вы действительно можете собрать напрямую. (он ставит метки на цели ветки). Тем не менее, он по-прежнему не справляется с преобразованием данных, я думаю, в основном это код.


Кстати, с GAS вы можете использовать .intel_syntax noprefix, но это стиль MASM, а не NASM, поэтому mov eax, symbol — это загрузка, а не mov — непосредственный адрес. (Вам понадобится mov eax, OFFSET symbol в GAS .intel_syntax). Подробнее о различиях между NASM и МАСМ.


mov [ebx], al и mov %al, (%ebx) — это одна и та же инструкция: однобайтовое сохранение al с использованием только ebx в качестве адреса. Если это привело к ошибке, то проблема не только в этой инструкции. Либо другие инструкции неверны, либо у вас другая проблема. Возможно, вы собрали свой код GAS как 64-битный? Сборка 32-разрядных двоичных файлов на 64-разрядном система (инструментарий GNU).

person Peter Cordes    schedule 27.12.2017

вы можете использовать objdump (otool на osx) для дизассемблирования в газовый формат.

person Camden    schedule 27.12.2017
comment
Это синтаксис Intel, но в стиле MASM, а не NASM. например mov eax, symbol — это загрузка из памяти в GAS и MASM, а mov — непосредственно адрес в NASM. См. stackoverflow.com/tags/intel-syntax/info. - person Peter Cordes; 27.12.2017

Во-первых, mov %al, %ecx не может ошибаться, потому что не обращается к памяти. Черт, он даже не должен собираться, потому что они разного размера. Тем не менее, правильный перевод вашего кода NASM — mov %al, (%ecx), который запишет al в память по адресу ecx.

Для другого вопроса: вам нужно $, если вы хотите сослаться на адрес. Таким образом, mov %rbx, $array недействителен, потому что вы не можете назначить адрес. Если вы хотите сохранить rbx в первом элементе массива, напишите mov %rbx, array. Если вы хотите загрузить первый элемент, используйте mov array, %rbx. Если вы хотите загрузить адрес первого элемента, выполните mov $array, %rbx или используйте lea, который является специальным и не требует $.

person Jester    schedule 16.09.2013
comment
Хорошо, спасибо. извините, я что-то пропустил. Я попробовал это, это сработало для ecx, но не для ebx. Я пробовал mov %al, (%ebx) и movb %al, (%ebx), все равно ошибка seg. Что я делаю? - person ThisGuy; 16.09.2013
comment
Это означает, что ebx имеет неверный адрес. Может быть, вы не загрузили его с адресом. Я могу только догадываться, не видя всего кода. Кроме того, это должен быть 64-битный код, ebx кажется неправильным. - person Jester; 16.09.2013
comment
Ну, я сделал что-то вроде: нажимаю %ebx и выталкиваю %ebx, затем после pop возникает ошибка seg. Здесь что-то не так? - person ThisGuy; 16.09.2013