|
|
  |
Функция main как метод класса, можно? |
|
|
|
Feb 13 2008, 22:20
|

Местный
  
Группа: Свой
Сообщений: 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 ?
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
Feb 14 2008, 07:21
|

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

|
А вы для начала опишите обычную функцию main Код void main(void) { program.main(); } и сгенерируйте листинг и/или файл на асм и посмотрите как там вызывается. тут главное какое имя сгенерируется для program.main
|
|
|
|
|
Feb 14 2008, 17:10
|

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

|
Цитата(KRS @ Feb 14 2008, 13:21)  А вы для начала опишите обычную функцию main Код void main(void) { program.main(); } и сгенерируйте листинг и/или файл на асм и посмотрите как там вызывается. тут главное какое имя сгенерируется для program.main Сгенерировалось имя _ZN7Program9MainEv. Это не то, надо явно указать компилятору, что хотим вызвать из ассемблерного кода метод класса. Т.е. вопрос сводится к как вызвать метод класса из ассемблера? Класс глобальный, в каком месте он инициализируется я не понял, но до main()
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
Feb 14 2008, 19:25
|

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

|
Цитата(InsolentS @ Feb 14 2008, 20:10)  Сгенерировалось имя _ZN7Program9MainEv. Это не то, надо явно указать компилятору, что хотим вызвать из ассемблерного кода метод класса. Как раз то. C++ для того, чтобы была возможна перегрузка делает декорацию имен (манглинг), из-за которого имена становятся такими страшными. Можно еще помедитировать, как вызывать из ассемблера одну определенную из таких функций: void foo(int); void foo(char const *); PS Я из ассемблера только extern "C" вызываю по этой причине.
|
|
|
|
|
Feb 14 2008, 22:52
|

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

|
Цитата(aaarrr @ Feb 15 2008, 00:29)  __main - это не пользовательский main, а библиотечная функция. Как её тогда перегрузить?
--------------------
Курильщик даташитов со стажем
|
|
|
|
|
Feb 15 2008, 07:43
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561

|
Цитата(InsolentS @ Feb 15 2008, 01:52)  Как её тогда перегрузить? ...main это не библиотечная функция и перегрузить ее нельзя. Более того она не отделима от программы на C, т.е должна существовать обязательно иначе компилятор на этапе линковки выдаст ошибку. Можно поменять так называемую точку входа (например MS Visual C это позволяет, впрочем и IAR for ARM тоже). Точка входа это тот адрес по которому передается управление приложению операционной системой по завершению создания образа приложения (если говорить про операционные системы) или адрес с которого стартует программа (если это программа для микроконтроллера и не используется ОС). Точкой входа может быть любая метка. Точка входа задается в линковщике.
|
|
|
|
|
Feb 15 2008, 08:54
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(tag @ Feb 15 2008, 10:43)  ...main это не библиотечная функция и перегрузить ее нельзя. __main в Keil'е (речь о нем, как я понимаю) это именно что библиотечная функция, занимающаяся подготовкой окружения и передающая управление пользовательскому main. Цитата(tag @ Feb 15 2008, 10:43)  Более того она не отделима от программы на C, т.е должна существовать обязательно иначе компилятор на этапе линковки выдаст ошибку. Вполне отделима - достаточно сказать линкеру, что стандартные библиотеки не используются.
|
|
|
|
|
Feb 18 2008, 07:12
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561

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