GetSmart
Nov 4 2009, 22:02
Допустим я объявил так значение
#define BUF_LIMIT 128
и хочу написать внутри сишного кода в операторе asm("ADD R10,#BUF_LIMIT")
Но т.к. внутри оператора asm-а находится строка, то препроцессор не заменяет внутри неё предефайненные символы.
Как быть?
GetSmart
Nov 4 2009, 22:33
А может существует универсальный вариант со 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));
То есть при использовании # внутри дефайна, параметр не заменяется на предефайненый, а используется как строка.
Код
#define BUF_LIMIT 128
#define ADD_STR_DEF(a) #a
#define ADEF(a) ADD_STR_DEF(a)
asm("CMP R10,#" ADEF(BUF_LIMIT));
demiurg_spb
Nov 5 2009, 10:44
А что за компилятор?
Для gcc можно написать инлайн асм функцию или макрос с аргументом, в качестве аргумента будет ваше задефайненное значение.
Так буде красивее.
Вот дока
GetSmart
Nov 5 2009, 12:54
Цитата(ReAl @ Nov 5 2009, 12:49)

...
Я так и знал, что должен быть вариант!!!
aaarrr меня чуть было не отговорил от моей идеи.
Какой компилятор? - Думаю, что этот вариант будет работать с любым.
Цитата(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)
GetSmart
Nov 5 2009, 20:34
Цитата(ReAl @ Nov 6 2009, 01:58)

Да. С любым вменяемым.
Точности ради - традиционное/общепринятое название этого макроса STRINGFY
Опять?!
Все самые прикольные макросы кто-то уже придумал до меня
http://trac-hg.assembla.com/roxanne/browser/util.hА вообще, очень интересный случай. Оказывается и от "пустышки" есть польза.
demiurg_spb
Nov 6 2009, 09:34
Цитата(ReAl @ Nov 5 2009, 22:58)

Точности ради - традиционное/общепринятое название этого макроса STRINGFY
Удивительно! Я уже много лет использую макросы с другими именами и считал, что они стандартные

Код
// str macro
#define STR(S) #S // STR(blabla) = "blabla"
#define XSTR(S) STR(S) // STR(_version) = "v1.0" if _version = "v1.0"
Цитата(demiurg_spb @ Nov 6 2009, 11:34)

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

Ну у меня тоже есть мания величия, но по
чужим исходникам (опять таки - по моему опыту

) stringfy встречается чаще всех остальных вариантов вместе взятых.
demiurg_spb
Nov 6 2009, 10:13
Цитата(ReAl @ Nov 6 2009, 12:56)

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

Ну у меня тоже есть мания величия, но по
чужим исходникам (опять таки - по моему опыту

) stringfy встречается чаще всех остальных вариантов вместе взятых.
А применял ли кто-нить этот макрос внутри asm() ?
Киньте ссылкой, плиз.
demiurg_spb
Nov 6 2009, 20:17
Цитата(GetSmart @ Nov 6 2009, 16:23)

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

Поясните пожалуйста подробнее...
Просто
GetSmart очень хочет быть первым хоть в чём-то:-)