Перейти к содержанию
    

Инлайн ассемблер в ARMCLANG

В гиде на компилятор V6 Keil выдаёт следующий формат встроенного ассемблера.
 

Inline assembly
The __asm keyword can incorporate inline GCC syntax assembly code into a function. For
example:
#include <stdio.h>
int add(int i, int j)
{
  int res = 0;
  __asm (
    "ADD %[result], %[input_i], %[input_j]"
    : [result] "=r" (res)
    : [input_i] "r" (i), [input_j] "r" (j)
  );
  return res;
}
int main(void)
{
  int a = 1;
  int b = 2;
  int c = 0;
  c = add(a,b);
  printf("Result of %d + %d = %d\n", a, b, c);
}
The general form of an __asm inline assembly statement is:
__asm(code [: output_operand_list [: input_operand_list [:
clobbered_register_list]]]);
code is the assembly code. In our example, this is "ADD %[result], %[input_i], %
[input_j]".
output_operand_list is an optional list of output operands, separated by commas. Each
operand consists of a symbolic name in square brackets, a constraint string, and a C expression
in parentheses. In our example, there is a single output operand: [result] "=r" (res).
input_operand_list is an optional list of input operands, separated by commas. Input
operands use the same syntax as output operands. In our example there are two input operands:
[input_i] "r" (i), [input_j] "r" (j).
clobbered_register_list is an optional list of clobbered registers. In our example, this is
omitted.

 Это вот так теперь нужно писать, перейдя с компилятора V5 на V6 (который для C++17)?
Читать вот здесь еще нашел.
https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html#Using-Assembly-Language-with-C

Я правильно еду? Что-то запутано всё.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, Forger сказал:

Ни один из них

Это был не вопрос, а утверждение. Если откроете список Language C++, то в нем есть c++17(community), gnu++17(community). Вполне себе работают (возможно, не полностью, не страшно, ошибок дадут, если что).
Вопрос был про ассемблер. Вы так его применяете, с таким не очевидным синтаксисом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, ViKo said:

Это был не вопрос, а утверждение. Если откроете список Language C++, то в нем есть c++17(community), gnu++17(community).

community - это значит далеко не всё работает

так же как и с++11 вроде как есть в v5, но он куцый и потому бесполезный, а вот в v6 он уже полностью по стандарту

 

1 minute ago, ViKo said:

Вопрос был про ассемблер. Вы так его применяете, с таким не очевидным синтаксисом?

Такие сложные конструкции не использовал (

Да, были небольшие сложности при переносе с v5, но они оказались вполне решаемы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот нашел для просветленья.
https://ru.wikipedia.org/wiki/GCC_Inline_Assembly

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У gcc инлайн ассемблера есть одно огромное преимущество - он позволяет с помощью себя и #define сделать реализацию любой intristic функции. Т.е. кусок ассемблера, оформленный как вызов inline функции (с параметрами и возвращаемым значением)

Компилятор сам протащит параметры в регистры и заберёт результат.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я от #define ухожу, где могу, цель такая. С++17 со всеми его красотами.

xvr, а пример можете подкинуть. Сравнить с...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, ViKo said:

Я от #define ухожу, где могу, цель такая. С++17 со всеми его красотами.

Пока местами проскакивают #define, но упорно с ними борюсь )

например, помощью constexpr auto:

constexpr auto kResolutionBits = 12;

А вы что используете для этого в C++17? 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, Forger сказал:

 


constexpr auto kResolutionBits = 12;

А вы что используете для этого в C++17? 

 

То же.
По моему, в вашем примере достаточно const. Здесь же нет выражения. Или обязательно constexpr? Недавно разбирался, но хочу уточнить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В плюсах #define вместо функции практически не нужен, потому что есть inline:
 

static inline void operator&=(uint32_t value)
{
	uint32_t temp;
	__asm__ __volatile__ (
			"MRS %[tmp], CONTROL \n\t"
			"AND %[tmp], %[tmp], %[val]  \n\t"
			"MSR CONTROL, %[tmp]  \n\t"
			:[tmp]"+r" (temp)     /* output */
			:[val]"r" (value)     /* input */
			:"memory"             /* clobbers */
	);
}

(Это оператор &= для регистра CONTROL в кортексах)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как напишу volatile (с любыми подчеркиваниями) после asm, так Кейл ошибку выдаёт на Loop - неизвестная команда.

{
__asm__ (
	"Loop:		// loop here \n\t"
	"SUBS %[res], %[inp], #1 \n\t"
	"BNE Loop"
	: [res] "=r" (qclk) /* result */
	: [inp] "r" (qclk)
	: /* No clobbers */
	);
}

Source/device.hpp(39): error: invalid symbol redefinition
        "Loop:          // loop here \n\t"
        ^
<inline asm>(1): note: instantiated into assembly here
        Loop:           // loop here 
        ^
1 error generated.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

54 minutes ago, ViKo said:

То же.
По моему, в вашем примере достаточно const. Здесь же нет выражения. Или обязательно constexpr? Недавно разбирался, но хочу уточнить.

Есть разница, и порой весьма существенная:

https://stackoverflow.com/questions/13346879/const-vs-constexpr-on-variables

https://habr.com/ru/post/228181/

 

constexpr это по сути #define, например, его смело можно использовать в параметрах шаблонов, поскольку это типичный compile-time объект

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

39 минут назад, ViKo сказал:

Как напишу volatile (с любыми подчеркиваниями) после asm, так Кейл ошибку выдаёт на Loop - неизвестная команда. 

Я что-то запутался, кейл или gcc? Вроде выше была ссылка на инлайн-ассемблер gcc, поэтому я и привёл свой пример.

А метки как-то иначе делаются. Сейчас найду.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, AHTOXA сказал:

Я что-то запутался, кейл или gcc? Вроде выше была ссылка на инлайн-ассемблер gcc, поэтому я и привёл свой пример.

А метки как-то иначе делаются. Сейчас найду.

Из Кейл руководства по миграции на компилятор V6.
 

Цитата

Inline assembly with Arm ®  Compiler 6
Inline assembly in Arm Compiler 6 must be written in GNU assembly syntax. Inline assembly in Arm
Compiler 5 is written in armasm syntax. If you have inline assembly written in armasm syntax, you must
modify this to use GNU assembly syntax.

 

Метка работает (во всяком случае, файл компилируется), если без volatile задать asm.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...