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

Как использовать внутри asm("...") значения из #define ?

Допустим я объявил так значение

#define BUF_LIMIT 128

и хочу написать внутри сишного кода в операторе asm("ADD R10,#BUF_LIMIT")

Но т.к. внутри оператора asm-а находится строка, то препроцессор не заменяет внутри неё предефайненные символы.

Как быть?

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


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

Как быть?

На выбор:

  • загрузить BUF_LIMIT заранее в локальную переменную
  • не увлекаться инлайн ассемблером
  • взять компилятор, который позволяет такие финты (например, RVCT)

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


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

А может существует универсальный вариант со 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

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


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

#define BUF_LIMIT 128

#define ADD_STR_DEF(a) #a

#define ADEF(a) ADD_STR_DEF(a)

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

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


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

А что за компилятор?

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

Так буде красивее. Вот дока

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


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

...

Я так и знал, что должен быть вариант!!! :)

aaarrr меня чуть было не отговорил от моей идеи.

 

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

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


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

Думаю, что этот вариант будет работать с любым.
Да. С любым вменяемым.

Точности ради - традиционное/общепринятое название этого макроса STRINGFY

#define STRINGFY2(x) #x
#define STRINGFY(x)  STRINGFY2(x)

или так

#define real_stringfy(x)    #x
#define stringfy(x)    real_stringfy(x)

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


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

Да. С любым вменяемым.

Точности ради - традиционное/общепринятое название этого макроса STRINGFY

Опять?!

Все самые прикольные макросы кто-то уже придумал до меня :biggrin:

 

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

 

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

Изменено пользователем GetSmart

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


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

Точности ради - традиционное/общепринятое название этого макроса STRINGFY

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

 

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

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


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

Удивительно! Я уже много лет использую макросы с другими именами и считал, что они стандартные:)
Ну у меня тоже есть мания величия, но по чужим исходникам (опять таки - по моему опыту ;) ) stringfy встречается чаще всех остальных вариантов вместе взятых.

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


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

stringfy встречается чаще всех остальных вариантов вместе взятых.
Пусть так. Но у меня не лежит душа к таким длинным именам...

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


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

Ну у меня тоже есть мания величия, но по чужим исходникам (опять таки - по моему опыту ;) ) stringfy встречается чаще всех остальных вариантов вместе взятых.

А применял ли кто-нить этот макрос внутри asm() ?

Киньте ссылкой, плиз.

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


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

А применял ли кто-нить этот макрос внутри asm() ?
В смысле? Real же дал пример.

Поясните пожалуйста подробнее...

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


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

Поясните пожалуйста подробнее...

 

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

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


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

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

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

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

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

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

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

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

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

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