ViKo 1 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба В гиде на компилятор 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 Я правильно еду? Что-то запутано всё. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 5 minutes ago, ViKo said: который для C++17? Ни один из них Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 3 минуты назад, Forger сказал: Ни один из них Это был не вопрос, а утверждение. Если откроете список Language C++, то в нем есть c++17(community), gnu++17(community). Вполне себе работают (возможно, не полностью, не страшно, ошибок дадут, если что). Вопрос был про ассемблер. Вы так его применяете, с таким не очевидным синтаксисом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 1 minute ago, ViKo said: Это был не вопрос, а утверждение. Если откроете список Language C++, то в нем есть c++17(community), gnu++17(community). community - это значит далеко не всё работает так же как и с++11 вроде как есть в v5, но он куцый и потому бесполезный, а вот в v6 он уже полностью по стандарту 1 minute ago, ViKo said: Вопрос был про ассемблер. Вы так его применяете, с таким не очевидным синтаксисом? Такие сложные конструкции не использовал ( Да, были небольшие сложности при переносе с v5, но они оказались вполне решаемы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба Вот нашел для просветленья.https://ru.wikipedia.org/wiki/GCC_Inline_Assembly Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба Дальше в лес: https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Extended-Asm http://www.ethernut.de/en/documents/arm-inline-asm.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба У gcc инлайн ассемблера есть одно огромное преимущество - он позволяет с помощью себя и #define сделать реализацию любой intristic функции. Т.е. кусок ассемблера, оформленный как вызов inline функции (с параметрами и возвращаемым значением) Компилятор сам протащит параметры в регистры и заберёт результат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба Я от #define ухожу, где могу, цель такая. С++17 со всеми его красотами. xvr, а пример можете подкинуть. Сравнить с... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 4 minutes ago, ViKo said: Я от #define ухожу, где могу, цель такая. С++17 со всеми его красотами. Пока местами проскакивают #define, но упорно с ними борюсь ) например, помощью constexpr auto: constexpr auto kResolutionBits = 12; А вы что используете для этого в C++17? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 7 минут назад, Forger сказал: constexpr auto kResolutionBits = 12; А вы что используете для этого в C++17? То же. По моему, в вашем примере достаточно const. Здесь же нет выражения. Или обязательно constexpr? Недавно разбирался, но хочу уточнить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба В плюсах #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 в кортексах) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба Как напишу 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 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 объект Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 39 минут назад, ViKo сказал: Как напишу volatile (с любыми подчеркиваниями) после asm, так Кейл ошибку выдаёт на Loop - неизвестная команда. Я что-то запутался, кейл или gcc? Вроде выше была ссылка на инлайн-ассемблер gcc, поэтому я и привёл свой пример. А метки как-то иначе делаются. Сейчас найду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 12 февраля, 2020 Опубликовано 12 февраля, 2020 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться