Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Директива компилятора в ассемблерной вставке
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Злодей
Доброго вечера!

Код
#define ADDRESS 0x3800 /*байт-адрес*/

void magic_function( void )
{
    /*   ...   */
    
    //теперь бы прыгнуть в ADDRESS.
    __asm__ __volatile__ ( "jmp " #(ADDRESS/2) );
}


Компилятор не понимает решетку. Помогите пожалуйста.
777777
А как у тебя адрес мог оказаться числовым, а не меткой?
А уж делить его на два это почти то же самое, что складывать метры с килограммами.
Сергей Борщ
Цитата(Злодей @ Apr 26 2009, 20:07) *
Компилятор не понимает решетку. Помогите пожалуйста.
Компилятор не понимает не решетку, а вообще такую запись. Вот же привычка партизанить! Для какого контроллера пишем, ау? Судя по делению на два - это может быть AVR, но у AVR решетка не используется (и делить на два тоже не нужно - ассемблер сделает это сам), решетка используется для MSP, но у него нет команды jmp. У ARM тоже нет команды jmp.
Вам надо внимательно изучить раздлел описания компилятора про constrains в inline-асме. То, что вы хотите, для AVR будет выглядеть примерно так:
Код
asm volatile ("jmp %0" ::"i"(ADDRESS));


И может тут вообще не нужен асм? Если это вызов загрузчика, то ((void(*)())0x3800)(); вполне может подойти для любого процессора.
Злодей
Спасибо!
demiurg_spb
Телепатирую немного...
Цитата(777777 @ Apr 27 2009, 07:19) *
А как у тебя адрес мог оказаться числовым, а не меткой?
Такое бывает в случае вызова бутлоадера.
Цитата
А уж делить его на два это почти то же самое, что складывать метры с килограммами.
Нет он переводит адрес из абсолютного в байтах в адрес слова (т.к. флеш у АВР имеет такую организацию).

Цитата(Сергей Борщ @ Apr 27 2009, 11:34) *
Компилятор не понимает не решетку, а вообще такую запись.
А решётка тут видимо для преобразования этого нечто в строковый литерал (помните макросы STR и XSTR...) для последующей склейки со строкой "jmp "... Ошибки в изложении собственного хотения налицоsmile.gif
Злодей
Теперь уже без ассемблерной вставки. Хочу вот такую штуку:

Код
#define STRING foo
#if ( STRING == foo )


Но выражение остаётся истинно, когда изменяю STRING.
Сергей Борщ
Цитата(Злодей @ Apr 28 2009, 09:04) *
Код
#define STRING foo
#if ( STRING == foo )


Но выражение остаётся истинно, когда изменяю STRING.
Что значит "изменяю STRING"? Покажите, как. И как у вас перед этим объявлен foo?
На всякий случай: читайте доки... выражение для #if - целочисленное. Там же описано, что необъявленный макрос трактуется как ноль.
Злодей
Простите, я думал будет понятно.... Проблемы со строками smile.gif
Хочу поменять такую конструкцию:
Код
#define SOMETHING_NORMAL
//#define SOMETHING_PARANOIC
#ifdef SOMETHING_NORMAL
    //...
#endif
#ifdef SOMETHING_PARANOIC
    //...
#endif

На
Код
/******************
    Код с ошибкой
******************/
#define SOMETHING NORMAL
//#define SOMETHING PARANOIC
#if ( SOMETHING == NORMAL )
    //...
#endif
#if ( SOMETHING == PARANOIC )
    //...
#endif


что бы NORMAL и PARANOIC были строчками а не макросами....
Сергей Борщ
Цитата(Злодей @ Apr 28 2009, 10:37) *
что бы NORMAL и PARANOIC были строчками а не макросами....
Сделать что-то вроде
Код
#define NORMAL  1
#define PARANOIC 2
#define SOMETHING PARANOIC
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.