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

 
 
> Положение поля в классе
Ivan.
сообщение Oct 9 2008, 05:48
Сообщение #1





Группа: Участник
Сообщений: 7
Регистрация: 13-02-07
Пользователь №: 25 325



Как получить Offset поля в классе?
Впринципе это вопрос общего назначения, но для уточнения, я пишу под WinAVR.
При применении ассемблерных вставок в C++ для работы со структурами появляется необходимость взятия переменной относительно какого-то объекта (указателя), например:
LDD R0, Y+OFFSET(T::i)
Написал define:
#define OFFSETT(Type, Item) ((int)(&((Type *)0)->Item))
Что впринципе и возврящает необходимую константу. В С++ такой прикол проканывает, в асме старого компилятора тоже, а в новом начинает через один ворчать, мол не константа это.
Подскажите, может есть какие нибудь иные способы решения?


--------------------
Я могу ВСЁ, вопрос, сколько времени у меня это займет.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ReAl
сообщение Oct 9 2008, 09:05
Сообщение #2


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

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



Цитата(Ivan. @ Oct 9 2008, 08:48) *
При применении ассемблерных вставок в C++
А чем не устраивает gcc-стандартное указание входных/выходных параметров в ассемблерной вставке
Код
class foo
{
  public:
    char a[4];
    uint8_t i, j;
};

void f(foo *p)
{
    __asm__ __volatile__ (
        "add %0, %1"
        : "+r" (p->i)
        : "r" (p->j)
    );
}


Код
.global    _Z1fP3foo
    .type    _Z1fP3foo, @function
_Z1fP3foo:
    movw r30,r24
    ldd r25,Z+5
    ldd r24,Z+4
/* #APP */
;  16 "c.cpp" 1
    add r24, r25
;  0 "" 2
/* #NOAPP */
    std Z+4,r24
    ret

Или в более сложных случаях эффективность падает?


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


RSS Текстовая версия Сейчас: 5th August 2025 - 22:49
Рейтинг@Mail.ru


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