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

 
 
 
Reply to this topicStart new topic
> Не получаеся вернуться из функции из в ASM коде для ARM7
Bulat
сообщение Apr 8 2009, 05:15
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Я привел кусок АСМ-кода, вызывающего функцию reverse5. По завершению ф-ии reverse5 делаю возврат: mov r15,r14. Но похоже возврата не происходит.. Почему?
;-------------------------------------------------------------------------------
reverse5:
ldr r5,=0x10
mov r4,r7
and r4,r4,r5
movs r5,r4,LSR#4 ;b[0] = (x & 0x10) >> 4, ãäå r7=x
ldr r4,=0x1
and r5,r5,r4 ;b[0] = b[0] & 0x1
str r5,[r13,#30]

ldr r5,=0x8
mov r4,r7
and r4,r4,r5
movs r5,r4,LSR#2 ;b[1] = (x & 0x8) >> 2, ãäå r7=x
ldr r4,=0x2
and r5,r5,r4 ;b[1] = b[1] & 0x1
str r5,[r13,#31]

ldr r4,=0x4
and r5,r7,r4 ;b[2] = x & 0x4
str r5,[r13,#32]

ldr r5,=0x2
mov r4,r7
and r4,r4,r5
movs r5,r4,LSL#2 ;b[3] = (x & 0x2) << 2, ãäå r7=x
ldr r4,=0x8
and r5,r5,r4 ;b[3] = b[3] & 0x8
str r5,[r13,#33]

ldr r5,=0x1
mov r4,r7
and r4,r4,r5
movs r5,r4,LSL#4 ;b[4] = (x & 0x1) << 4, ãäå r7=x
ldr r4,=0x10
and r5,r5,r4 ;b[4] = b[4] & 0x10
str r5,[r13,#34]

ldr r4,[r13,#30]
ldr r5,[r13,#31]
and r7,r4,r5
ldr r4,[r13,#32]
ldr r5,[r13,#33]
and r7,r4,r5
ldr r5,[r13,#34]
and r7,r7,r5 ;x = b[0]|b[1]|b[2]|b[3]|b[4]

mov r15,r14 ;load LR into PC (r15) [causing a return]
;-------------------------------------------------------------------------------

Main:
mov r7,r11
B reverse5
Go to the top of the page
 
+Quote Post
meister
сообщение Apr 8 2009, 06:27
Сообщение #2


Местный
***

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



Цитата(Bulat @ Apr 8 2009, 09:15) *
Я привел кусок АСМ-кода, вызывающего функцию reverse5. По завершению ф-ии reverse5 делаю возврат: mov r15,r14. Main:
mov r7,r11
B reverse5


Если мне не изменяет мой склероз, то возврат из "функции" делается BX lr, а вызов BL label.
Go to the top of the page
 
+Quote Post
Bulat
сообщение Apr 8 2009, 08:35
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Цитата(meister @ Apr 8 2009, 12:27) *
Если мне не изменяет мой склероз, то возврат из "функции" делается BX lr, а вызов BL label.

BX и BL не помогли. Разве при переходе BL содержимое PC запоминается?
Go to the top of the page
 
+Quote Post
meister
сообщение Apr 8 2009, 08:39
Сообщение #4


Местный
***

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



Цитата(Bulat @ Apr 8 2009, 12:35) *
BX и BL не помогли. Разве при переходе BL содержимое PC запоминается?


Как бы есть "ARM Instruction Set", там написано:

Код
Branch with Link (BL) writes the old PC into the link register (R14) of the current bank.
The PC value written into R14 is adjusted to allow for the prefetch, and contains the
address of the instruction following the branch and link instruction. Note that the CPSR
is not saved with the PC and R14[1:0] are always cleared.
To return from a routine called by Branch with Link use MOV PC,R14 if the link register
is still valid or LDM Rn!,{..PC} if the link register has been saved onto a stack pointed
to by Rn.
Go to the top of the page
 
+Quote Post
KAlex
сообщение Apr 8 2009, 08:59
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(Bulat @ Apr 8 2009, 08:15) *
Я привел кусок АСМ-кода, вызывающего функцию reverse5. По завершению ф-ии reverse5 делаю возврат: mov r15,r14. Но похоже возврата не происходит.. Почему?

Пишешь на С, смотришь во что это получается на АСМе, оптимизируешь.
Go to the top of the page
 
+Quote Post
dch
сообщение Apr 8 2009, 11:20
Сообщение #6


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

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



На сайте arm.com должен быть документ - соглашение о передаче параметров - типа си лангвидже процедуре кол агримент
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 8 2009, 11:34
Сообщение #7


Гуру
******

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



Цитата(dch @ Apr 8 2009, 15:20) *
На сайте arm.com должен быть документ - соглашение о передаче параметров - типа си лангвидже процедуре кол агримент

Документ называется AAPCS.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 8 2009, 13:11
Сообщение #8


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Если весь проект на ASM'e можно AAPCS и не придерживаться - дело хозяйское. У автора ветки так вроде и есть, раз main тоже на ASM'e.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 8 2009, 13:20
Сообщение #9


Гуру
******

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



Цитата(sergeeff @ Apr 8 2009, 17:11) *
Если весь проект на ASM'e можно AAPCS и не придерживаться - дело хозяйское.

Ну да, а потом очень весело будет, когда понадобится его куда-нибудь встроить.

Не настолько обременителен стандарт, чтобы его избегать.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 8 2009, 14:15
Сообщение #10


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Автору ветки встречный вопрос: откуда у него мысли про невозврат из функции? Какие у него есть возможности по тестированию? Наличие JTAG или хотя бы возможности вкл/выкл LED? Может вызываемая функция виснет в бесконечном цикле?

По любому вызов функции из main:
- bl reverse5 или
- mov lr, pc
bx r0

Возврат:
- mov pc,lr или
- bx lr
Go to the top of the page
 
+Quote Post

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

 


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


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