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

 
 
 
Reply to this topicStart new topic
> Функция main как метод класса, можно?
InsolentS
сообщение Feb 13 2008, 22:20
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897



хочу сделать функцию main методом класса, например
Код
class Program
{
  private:
    Program(){};
    static int main(void);
};

Program program;

int Program::main(void)
{
  while(1);
}
...

но проблема в том, что не знаю как обратится к такой функции из ассемблера, т.е. на что заменить строки startup файла
Код
; Enter the C code

                IMPORT  __main
                LDR     R0, =__main
                BX      R0

?


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 14 2008, 07:21
Сообщение #2


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



А вы для начала опишите обычную функцию main
Код
void main(void)
{
  program.main();
}

и сгенерируйте листинг и/или файл на асм и посмотрите как там вызывается.
тут главное какое имя сгенерируется для program.main
Go to the top of the page
 
+Quote Post
InsolentS
сообщение Feb 14 2008, 17:10
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897



Цитата(KRS @ Feb 14 2008, 13:21) *
А вы для начала опишите обычную функцию main
Код
void main(void)
{
  program.main();
}

и сгенерируйте листинг и/или файл на асм и посмотрите как там вызывается.
тут главное какое имя сгенерируется для program.main

Сгенерировалось имя _ZN7Program9MainEv.
Это не то, надо явно указать компилятору, что хотим вызвать из ассемблерного кода метод класса.
Т.е. вопрос сводится к как вызвать метод класса из ассемблера?
Класс глобальный, в каком месте он инициализируется я не понял, но до main()


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 14 2008, 17:31
Сообщение #4


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(InsolentS @ Feb 14 2008, 20:10) *
Сгенерировалось имя _ZN7Program9MainEv.
Это не то, надо явно указать компилятору, что хотим вызвать из ассемблерного кода метод класса.
Т.е. вопрос сводится к как вызвать метод класса из ассемблера?

Так в листинге на ассемблере и посмотрите как вызывается.
Поставте галочку include asm в листинге или просто асм файл сгенерируйте
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 14 2008, 18:29
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



__main - это не пользовательский main, а библиотечная функция.
Go to the top of the page
 
+Quote Post
meister
сообщение Feb 14 2008, 19:25
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(InsolentS @ Feb 14 2008, 20:10) *
Сгенерировалось имя _ZN7Program9MainEv.
Это не то, надо явно указать компилятору, что хотим вызвать из ассемблерного кода метод класса.


Как раз то. C++ для того, чтобы была возможна перегрузка делает декорацию имен (манглинг), из-за которого имена становятся такими страшными.

Можно еще помедитировать, как вызывать из ассемблера одну определенную из таких функций:

void foo(int);
void foo(char const *);

PS
Я из ассемблера только extern "C" вызываю по этой причине.
Go to the top of the page
 
+Quote Post
InsolentS
сообщение Feb 14 2008, 22:52
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897



Цитата(aaarrr @ Feb 15 2008, 00:29) *
__main - это не пользовательский main, а библиотечная функция.

Как её тогда перегрузить?


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 15 2008, 07:00
Сообщение #8


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(InsolentS @ Feb 15 2008, 04:52) *
Как её тогда перегрузить?

Вопрос в сторону, прошу прощения: а зачем все это?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
tag
сообщение Feb 15 2008, 07:43
Сообщение #9


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

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(InsolentS @ Feb 15 2008, 01:52) *
Как её тогда перегрузить?

...main это не библиотечная функция и перегрузить ее нельзя. Более того она не отделима от программы на C, т.е должна существовать обязательно иначе компилятор на этапе линковки выдаст ошибку. Можно поменять так называемую точку входа (например MS Visual C это позволяет, впрочем и IAR for ARM тоже). Точка входа это тот адрес по которому передается управление приложению операционной системой по завершению создания образа приложения (если говорить про операционные системы) или адрес с которого стартует программа (если это программа для микроконтроллера и не используется ОС). Точкой входа может быть любая метка. Точка входа задается в линковщике.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 15 2008, 08:54
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(tag @ Feb 15 2008, 10:43) *
...main это не библиотечная функция и перегрузить ее нельзя.

__main в Keil'е (речь о нем, как я понимаю) это именно что библиотечная функция, занимающаяся подготовкой окружения и передающая управление пользовательскому main.

Цитата(tag @ Feb 15 2008, 10:43) *
Более того она не отделима от программы на C, т.е должна существовать обязательно иначе компилятор на этапе линковки выдаст ошибку.

Вполне отделима - достаточно сказать линкеру, что стандартные библиотеки не используются.
Go to the top of the page
 
+Quote Post
tag
сообщение Feb 18 2008, 07:12
Сообщение #11


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

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(aaarrr @ Feb 15 2008, 11:54) *
__main в Keil'е (речь о нем, как я понимаю) это именно что библиотечная функция, занимающаяся подготовкой окружения и передающая управление пользовательскому main.
Вполне отделима - достаточно сказать линкеру, что стандартные библиотеки не используются.



....__main - библиотечная функция (она и есть точка входа), а вот main не библиотечная.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 17:29
Рейтинг@Mail.ru


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