Странное поведение GCC с ассемблером ARM. Инструкция ANDSEQ - PullRequest
0 голосов
/ 05 июля 2018

Если я попытаюсь собрать эту программу:

.text
main:
 andseq r1,r3,r2,lsl #13

С помощью команды gcc -c test.s я получаю следующую ошибку:

Error: bad instruction `andseq r1,r3,r2,lsl#13'

После некоторых попыток я заменил andseq на andeqs, и теперь он прекрасно компилируется.

Но если я дам дамп получившегося файла obj с objdump -d test.o, я получу это:

Disassembly of section .text:

00000000 <main>:
   0:   00131682        andseq  r1, r3, r2, lsl #13

Обратите внимание, как инструкция расшифрована как andseq ....

Я что-то упустил? Это ошибка?

Моя система - Raspbian GNU / Linux 8, а мой gcc -: gcc (Raspbian 4.9.2-10) 4.9.2. Я также протестировал с gcc-8.1.0 (редактировать, не вижу редактирования), те же результаты.

EDIT:

На самом деле кажется, что я использую те же binutils с gcc8, так что я действительно протестировал только это GNU assembler (GNU Binutils for Raspbian) 2.25. Я попробую более свежий ассемблер.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Существует хорошая мнемоническая таблица UAL по сравнению с UAL до ARMv8 Приложение K6 "Устаревший синтаксис инструкций для наборов инструкций AArch32"

Одна из записей этой таблицы:

Pre-UAL syntax    UAL equivalent
AND<c>S           ANDS<c>

, где eq - один из возможных кодов состояния <c>.

0 голосов
/ 09 июля 2018

Для совместимости со старыми файлами сборки, GNU по умолчанию имеет разделенный синтаксис для сборки ARM. В разделенном синтаксисе andeqs - правильная мнемоника для желаемой инструкции. Вы можете выдать директиву .syntax unified для выбора унифицированного синтаксиса, в которой andseq является правильной мнемоникой.

GNU objdump, с другой стороны, знает только унифицированный синтаксис, который объясняет явное несоответствие.

Для новых разработок я советую вам последовательно использовать унифицированный синтаксис, если это возможно.

...