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

 
 
> Возврат на основную программу из ассемблерной подпрограммы, вызванной еще одной асемблерной подпрограммой.
Omnicake
сообщение Apr 18 2014, 07:05
Сообщение #1


Участник
*

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



Здравствуйте, подскажите, какой команду в THUMB инструкции ассемблера использовать, чтобы вернутся из подпрограммы на asm в main.c если сама подпрограмма была вызвана из другой? То есть путь примерно такой: main.c -> подпрограмма1.s -> подпрограмма.2.s . Нужно из подпрограммы2 прыгнуть в main.c. Ранее использовал bx lr, но тут вложение глубже. Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 12)
demiurg_spb
сообщение Apr 18 2014, 07:50
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 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 (даже выделено рамкойsm.gif )
И вообще вся глава 4 будет вам полезна.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Omnicake
сообщение Apr 18 2014, 08:13
Сообщение #3


Участник
*

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



Случай в рамке описывает сценарий, когда main тоже на ассемблере и можно использовать PUSH LR, а как мне поступить если main является c-файлом?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Apr 18 2014, 08:53
Сообщение #4


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

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Omnicake
сообщение Apr 18 2014, 09:00
Сообщение #5


Участник
*

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



Немного запутался...получается если у меня будет прописано B sub2, произойдет прыжок на подпрограммы2, в которой я в конце пишу BX LR, обеспечивающая возврат на подпрограмму 1 на строчку после B sub2 (END например) и после выполнения END он выйдет на main?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Apr 18 2014, 09:16
Сообщение #6


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



При вызове sub1 из main адрес возврата сохраняется в регистре LR.
Соответственно, для возврата нужно содержимое LR записать в PC (счётчик команд), команда BX LR именно это и делает.

Но если мы хотим из sub1 вызвать sub2, то так просто это уже не сделать, нужно куда-то сохранить текущее содержимое LR, оно нам ещё потребуется, ведь в нём лежит адрес возврата (в main).
Поэтому в sub1 придётся написать
PUSH {LR} ;
......
BL sub2
POP {PC}
И вот это всё можно заменить на простой переход к sub2.
В LR тогда останется адрес возврата в main, куда и произойдёт возврат из sub2 после исполнения в ней команды BX LR


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Omnicake
сообщение Apr 18 2014, 09:19
Сообщение #7


Участник
*

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



Все, понял. Пробежался по ссылке выше (спасибо большое, кстати) и дошло. Команда B - не изменяет состояние регистра LR, поэтому при переходе от sub1 к sub2 он не изменится и можно будет через BX LR во второй программе на него вернуться. Спасибо за помощь.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 18 2014, 09:20
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



На C пишите, а в ассемблерный листинг глядите! Иначе - капец!
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 18 2014, 10:50
Сообщение #9


Гуру
******

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



Цитата(Omnicake @ Apr 18 2014, 13:19) *
Все, понял. Пробежался по ссылке выше (спасибо большое, кстати) и дошло. Команда B - не изменяет состояние регистра LR, поэтому при переходе от sub1 к sub2 он не изменится и можно будет через BX LR во второй программе на него вернуться. Спасибо за помощь.

скажите, а в чем сакральный смысл такого подхода?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Apr 18 2014, 11:45
Сообщение #10


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(toweroff @ Apr 18 2014, 17:50) *
скажите, а в чем сакральный смысл такого подхода?

Это оптимизация путём отрубания хвостов, или, выражаясь высоким штилем, устранение хвостовой рекурсии.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 18 2014, 12:05
Сообщение #11


Гуру
******

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



Цитата(SSerge @ Apr 18 2014, 15:45) *
Это оптимизация путём отрубания хвостов, или, выражаясь высоким штилем, устранение хвостовой рекурсии.

но так вроде же оптимизатор сам должен это делать?

UPD
Сейчас специально проверил пример из ссылки. Вызов из main() одной функции, в ней переход B в рекурсивную, там вычисления все в простом цикле, после чего возврат из первой стандартно BX LR с сохранением результата в R0
Keil 5.10, armcc 5.04.0.49
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Apr 18 2014, 22:24
Сообщение #12


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(toweroff @ Apr 18 2014, 16:05) *
....Сейчас специально проверил пример из ссылки.....



тсссссс. спугнёте велостроителей...
а так всё красиво начиналось... sad.gif
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Apr 20 2014, 15:57
Сообщение #13


Знающий
****

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



Честно не знал, что компиляторы си умеют TCO. Теперь не буду так рекурсии избегать, как обычно.
Go to the top of the page
 
+Quote Post

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

 


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


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