LINUX.ORG.RU

GNU Ассемблер ошибка логического И регистра и числа

 


0

2

Добрый день,

Изучаю GNU ASM. Пишу под ARM (STM32), но надеюсь отличия не критичные. Вот что пытаюсь сделать:

mov r4,# (r6 & 0x20)

Вот что получаю: Error: invalid operands (*UND* and *UND* sections) for `&' Не могу понять как сделать логическое И правильно. Подскажите пожалуйста, заранее спасибо.


Не знаю, что там на арме и как оно на gnu asm, но раз уж это ассемблер, то одной инструкцией делай умножение, а уже другой перемещай.

d ★★★★
()

просто не спеши. Вспомни первый класс, в асме лучше если не уверен - решать по шагам

upcFrost ★★★★★
()

в документации на ассемблер проца перечислены допустимые операнды для команд

anonymous
()
Ответ на: комментарий от Kuraga

unshifted register, естественно означает, что к регистру не применяется сдвиг (использование оного типично для ARM), но в данной инструкции он не был задан. Формально все корректно, вот пример с самого ARM-а:

AND     R9, R2, #0xFF00

Есть только ограничение на целочисленный операнд.

io ★★
()
Ответ на: комментарий от Kuraga

Пишет unshifted register required. Что значит unshifted?

Какой именно STM32 используется? Если это что-то из Cortex-M0+, то нужно разделять на 2 инструкции.

alexru ★★★★
()
Ответ на: комментарий от anonymous

Спасибо. А если R6 - 32 битное число? Мне например нужно сделать побитовое И чтобы вычислить смещение от базы, в 32 битном адресе....?

Kuraga
() автор топика
Ответ на: комментарий от io

По логике да и в KEIL все работает. А вот GNU ASM выпендривается что-то... не могу найти причину - какой там ему сдвиг мешает...

Kuraga
() автор топика
Ответ на: комментарий от Kuraga

Я попробовал вставить эту строчку в проект для Атмеловского M4 и GCC ее проглотил. Так что фиг знает почему не работает, строчка совершенно правильная.

alexru ★★★★
()
Ответ на: комментарий от alexru

Интересно. А какой компилятор использовался? Я пробовал на EmBlocks. Может неправильный компилятор выбрал...

Kuraga
() автор топика
Ответ на: комментарий от Kuraga

Стандартный Атмеловский.

Сейчас попробовал с официальным компилятором от ARM (https://launchpad.net/gcc-arm-embedded). Тоже работает.

Вот как это выглядит в objdump:

  40020e:	f006 0420 	and.w	r4, r6, #32

Собирается с

CFLAGS += -mcpu=cortex-m4 -mthumb
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16

alexru ★★★★
()
Ответ на: комментарий от alexru

Спасибо. понял что изначально совершил ошибку - надо сразу было искать официальный компилятор.

Kuraga
() автор топика
Ответ на: комментарий от io

Я немного не понял описанного. Не с точки зрения английского, скорее не понял что имеется ввиду...

Kuraga
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.