|
|
  |
Возврат на основную программу из ассемблерной подпрограммы, вызванной еще одной асемблерной подпрограммой. |
|
|
|
Apr 18 2014, 07:05
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 12-01-14
Из: Омск
Пользователь №: 80 002

|
Здравствуйте, подскажите, какой команду в THUMB инструкции ассемблера использовать, чтобы вернутся из подпрограммы на asm в main.c если сама подпрограмма была вызвана из другой? То есть путь примерно такой: main.c -> подпрограмма1.s -> подпрограмма.2.s . Нужно из подпрограммы2 прыгнуть в main.c. Ранее использовал bx lr, но тут вложение глубже. Заранее спасибо.
|
|
|
|
|
Apr 18 2014, 07:50
|

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

|
Цитата(Omnicake @ Apr 18 2014, 11:05)  Здравствуйте, подскажите, какой команду в THUMB инструкции ассемблера использовать, чтобы вернутся из подпрограммы на asm в main.c если сама подпрограмма была вызвана из другой? Той же самой: BX LR Definitive Guide to the ARM Cortex-M3, Second EditionГлава 4.3.4 (даже выделено рамкой  ) И вообще вся глава 4 будет вам полезна.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Apr 18 2014, 08:13
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 12-01-14
Из: Омск
Пользователь №: 80 002

|
Случай в рамке описывает сценарий, когда main тоже на ассемблере и можно использовать PUSH LR, а как мне поступить если main является c-файлом?
|
|
|
|
|
Apr 18 2014, 08:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(Omnicake @ Apr 18 2014, 14:05)  То есть путь примерно такой: main.c -> подпрограмма1.s -> подпрограмма.2.s . Нужно из подпрограммы2 прыгнуть в main.c. А зачем? Вам же самому потом по этим граблям ходить! Другое дело, когда в подпрограмма1 есть вызов подпрограмма2 и сразу же после него возврат. В этом случае можно немного поэкономить, заменив две команды в самом конце подпрограмма1 BL sub2 ;вызов подпрограммы2 BX LR ;возврат из подпрограммы1 в main тут я немного погорячился, см. нижена одну команду B sub2 ;переход на подпрограмму2 с последующим возвратом из неё сразу в main
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Apr 18 2014, 09:00
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 12-01-14
Из: Омск
Пользователь №: 80 002

|
Немного запутался...получается если у меня будет прописано B sub2, произойдет прыжок на подпрограммы2, в которой я в конце пишу BX LR, обеспечивающая возврат на подпрограмму 1 на строчку после B sub2 (END например) и после выполнения END он выйдет на main?
|
|
|
|
|
Apr 18 2014, 09:19
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 12-01-14
Из: Омск
Пользователь №: 80 002

|
Все, понял. Пробежался по ссылке выше (спасибо большое, кстати) и дошло. Команда B - не изменяет состояние регистра LR, поэтому при переходе от sub1 к sub2 он не изменится и можно будет через BX LR во второй программе на него вернуться. Спасибо за помощь.
|
|
|
|
|
Apr 18 2014, 11:45
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(toweroff @ Apr 18 2014, 17:50)  скажите, а в чем сакральный смысл такого подхода? Это оптимизация путём отрубания хвостов, или, выражаясь высоким штилем, устранение хвостовой рекурсии.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Apr 18 2014, 12:05
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(SSerge @ Apr 18 2014, 15:45)  Это оптимизация путём отрубания хвостов, или, выражаясь высоким штилем, устранение хвостовой рекурсии. но так вроде же оптимизатор сам должен это делать? UPD Сейчас специально проверил пример из ссылки. Вызов из main() одной функции, в ней переход B в рекурсивную, там вычисления все в простом цикле, после чего возврат из первой стандартно BX LR с сохранением результата в R0Keil 5.10, armcc 5.04.0.49
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|