реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как использовать внутри asm("...") значения из #define ?
GetSmart
сообщение Nov 4 2009, 22:02
Сообщение #1


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Допустим я объявил так значение
#define BUF_LIMIT 128
и хочу написать внутри сишного кода в операторе asm("ADD R10,#BUF_LIMIT")
Но т.к. внутри оператора asm-а находится строка, то препроцессор не заменяет внутри неё предефайненные символы.
Как быть?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 4 2009, 22:11
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(GetSmart @ Nov 5 2009, 01:02) *
Как быть?

На выбор:
  • загрузить BUF_LIMIT заранее в локальную переменную
  • не увлекаться инлайн ассемблером
  • взять компилятор, который позволяет такие финты (например, RVCT)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 4 2009, 22:33
Сообщение #3


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



А может существует универсальный вариант со Stringizing Operator (#) внутри #define?
Я немного попытался, но с первого раза не получилось. Может кто-нить знает как? Пускай даже это будет выглядеть немного криво, но лишь бы работало.

Дело в том, что в asm() внутри одной строки можно её порезать на несколько строк типа asm("MOV " "R15" ",R14") и компилятор это нормально переварит.

Вот такой вариант у меня почему-то не работает, хотя выглядит логично.
#define ADD_STR_DEF(a) #a
asm("CMP R10,#" ADD_STR_DEF(BUF_LIMIT));

причём вот так вот компилит как надо:
asm("CMP R10,#" ADD_STR_DEF(128));

То есть при использовании # внутри дефайна, параметр не заменяется на предефайненый, а используется как строка.

Сообщение отредактировал GetSmart - Nov 4 2009, 22:54


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 5 2009, 06:49
Сообщение #4


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Код
#define BUF_LIMIT 128

#define ADD_STR_DEF(a) #a

#define ADEF(a) ADD_STR_DEF(a)

asm("CMP R10,#" ADEF(BUF_LIMIT));


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 5 2009, 10:44
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



А что за компилятор?
Для gcc можно написать инлайн асм функцию или макрос с аргументом, в качестве аргумента будет ваше задефайненное значение.
Так буде красивее. Вот дока


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 5 2009, 12:54
Сообщение #6


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(ReAl @ Nov 5 2009, 12:49) *
...

Я так и знал, что должен быть вариант!!! smile.gif
aaarrr меня чуть было не отговорил от моей идеи.

Какой компилятор? - Думаю, что этот вариант будет работать с любым.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 5 2009, 19:58
Сообщение #7


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(GetSmart @ Nov 5 2009, 14:54) *
Думаю, что этот вариант будет работать с любым.
Да. С любым вменяемым.
Точности ради - традиционное/общепринятое название этого макроса STRINGFY
Код
#define STRINGFY2(x) #x
#define STRINGFY(x)  STRINGFY2(x)

или так
Код
#define real_stringfy(x)    #x
#define stringfy(x)    real_stringfy(x)


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 5 2009, 20:34
Сообщение #8


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(ReAl @ Nov 6 2009, 01:58) *
Да. С любым вменяемым.
Точности ради - традиционное/общепринятое название этого макроса STRINGFY

Опять?!
Все самые прикольные макросы кто-то уже придумал до меня biggrin.gif

http://trac-hg.assembla.com/roxanne/browser/util.h

А вообще, очень интересный случай. Оказывается и от "пустышки" есть польза.

Сообщение отредактировал GetSmart - Nov 5 2009, 20:17


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 6 2009, 09:34
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ReAl @ Nov 5 2009, 22:58) *
Точности ради - традиционное/общепринятое название этого макроса STRINGFY

Удивительно! Я уже много лет использую макросы с другими именами и считал, что они стандартныеsmile.gif

Код
// str macro
#define STR(S)   #S       // STR(blabla) = "blabla"
#define XSTR(S)  STR(S)   // STR(_version) = "v1.0" if _version = "v1.0"


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 6 2009, 09:56
Сообщение #10


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(demiurg_spb @ Nov 6 2009, 11:34) *
Удивительно! Я уже много лет использую макросы с другими именами и считал, что они стандартныеsmile.gif
Ну у меня тоже есть мания величия, но по чужим исходникам (опять таки - по моему опыту wink.gif ) stringfy встречается чаще всех остальных вариантов вместе взятых.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 6 2009, 10:13
Сообщение #11


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ReAl @ Nov 6 2009, 12:56) *
stringfy встречается чаще всех остальных вариантов вместе взятых.
Пусть так. Но у меня не лежит душа к таким длинным именам...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 6 2009, 13:23
Сообщение #12


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(ReAl @ Nov 6 2009, 15:56) *
Ну у меня тоже есть мания величия, но по чужим исходникам (опять таки - по моему опыту wink.gif ) stringfy встречается чаще всех остальных вариантов вместе взятых.

А применял ли кто-нить этот макрос внутри asm() ?
Киньте ссылкой, плиз.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 6 2009, 20:17
Сообщение #13


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(GetSmart @ Nov 6 2009, 16:23) *
А применял ли кто-нить этот макрос внутри asm() ?
В смысле? Real же дал пример.
Поясните пожалуйста подробнее...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 6 2009, 20:21
Сообщение #14


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(demiurg_spb @ Nov 7 2009, 01:17) *
Поясните пожалуйста подробнее...


Просто GetSmart очень хочет быть первым хоть в чём-то:-)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 6 2009, 20:30
Сообщение #15


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



smile.gif


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 18:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.0151 секунд с 7
ELECTRONIX ©2004-2016