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

 
 
 
Reply to this topicStart new topic
> Директива компилятора в ассемблерной вставке
Злодей
сообщение Apr 26 2009, 17:07
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Доброго вечера!

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

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


Компилятор не понимает решетку. Помогите пожалуйста.
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 27 2009, 03:19
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



А как у тебя адрес мог оказаться числовым, а не меткой?
А уж делить его на два это почти то же самое, что складывать метры с килограммами.
Причина редактирования: Ненужное цитирование.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 27 2009, 07:34
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


И может тут вообще не нужен асм? Если это вызов загрузчика, то ((void(*)())0x3800)(); вполне может подойти для любого процессора.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Злодей
сообщение Apr 27 2009, 07:50
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Спасибо!
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 27 2009, 18:35
Сообщение #5


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

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



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

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


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


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Теперь уже без ассемблерной вставки. Хочу вот такую штуку:

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


Но выражение остаётся истинно, когда изменяю STRING.

Сообщение отредактировал Злодей - Apr 28 2009, 06:05
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 28 2009, 07:04
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Злодей @ Apr 28 2009, 09:04) *
Код
#define STRING foo
#if ( STRING == foo )


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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Злодей
сообщение Apr 28 2009, 07:37
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Простите, я думал будет понятно.... Проблемы со строками 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, 07:40
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 28 2009, 09:12
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Злодей @ Apr 28 2009, 10:37) *
что бы NORMAL и PARANOIC были строчками а не макросами....
Сделать что-то вроде
Код
#define NORMAL  1
#define PARANOIC 2
#define SOMETHING PARANOIC


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th June 2025 - 15:07
Рейтинг@Mail.ru


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