Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-дек-13 11:29

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: ASM для 1986ВЕ1Т вложенные функции
СообщениеДобавлено: 2018-янв-25 18:16 
Не в сети

Зарегистрирован: 2011-янв-26 17:34
Сообщения: 38
Здравствуйте. В программе на ASM (Кейл) для 1986ВЕ1Т с помощью команды BL вызывается функция FUNC1. Может ли в этой вызываемой FUNC1 быть своя, вызываемая с помощью команды BL, другая функция FUNC2. Может ли в вызываемой FUNC2 быть своя, вызываемая с помощью команды BL, третья функция FUNC3. И т.д... Т.е. обеспечивается ли режим вложенных функций и на сколько ступеней вложения? Какие проблемы возникают при этом с сохранением регистров?
Вопрос возник в связи со следующей причиной. ASM программа была сделана на основе листинга рабочей "Си казённой миландровской рабочей программы" для платы EVAL. Компиляция ASM программы была сделана без ошибок, но программа не работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ASM для 1986ВЕ1Т вложенные функции
СообщениеДобавлено: 2018-янв-27 15:42 
Не в сети

Зарегистрирован: 2016-окт-14 19:39
Сообщения: 44
Откуда: СПБ
Если в функции вызывается другая функция, то надо сохранить на стеке регистр LR, а потом восстановить его.

Количество вложений ограничивается только размером стека.

Про проблемы мне не известно.

Вот как компилятор делает:
Код:
void func1(void)
{
}

void func2(void)
{
   func1();
}

void func3(void)
{
   func2();
}

Код:
                  func1 PROC
;;;76     
;;;77     void func1(void)
000000  4770              BX       lr
;;;78     {
;;;79     }
;;;80     
                          ENDP


                          AREA ||i.func2||, CODE, READONLY, ALIGN=1

                  func2 PROC
;;;80     
;;;81     void func2(void)
000000  b500              PUSH     {lr}
;;;82     {
;;;83        func1();
000002  f7fffffe          BL       func1
;;;84     }
000006  bd00              POP      {pc}
;;;85     
                          ENDP


                          AREA ||i.func3||, CODE, READONLY, ALIGN=1

                  func3 PROC
;;;85     
;;;86     void func3(void)
000000  b500              PUSH     {lr}
;;;87     {
;;;88        func2();
000002  f7fffffe          BL       func2
;;;89     }
000006  bd00              POP      {pc}
;;;90     
                          ENDP


upd: Возможно, имеется в виду сохранение и других регистров. Так это надо смотреть соглашение о вызовах функций - на чьей совести сохранение тех или иных регистров, при вызове функции какие регистры гарантировано сохраняются, какие могут изменяться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ASM для 1986ВЕ1Т вложенные функции
СообщениеДобавлено: 2018-янв-27 22:11 
Не в сети

Зарегистрирован: 2011-янв-26 17:34
Сообщения: 38
Спасибо за ответ.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB