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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Keil и thumb ассемблер ARM, проблема с передачей и возвращением данный из си ф-ии в асм
aaarrr
сообщение Mar 18 2011, 13:26
Сообщение #16


Гуру
******

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



По порядку:
1. В своей подпрограмме вы не имеете права портить R5. Можно портить только R0-R3 и R12.
2. Результат должен возвращается в R0.

Код
static __asm int MUL_F1(int x, int y)
{
    smull r0, r0, r1;
    BX   lr         ; Return.
}

int main(void)
{
    int x=0xfffff, y=0xffff;
    int z;

    z=MUL_F1(x, y);
}


3. Вы передаете rezult как параметр, получить что-либо обратно в него нельзя.
Чтобы иметь возможность что-то вернуть, можно использовать указатель:

Код
static __asm void MUL_F1(int *res, int x, int y)
{
    smull r1, r1, r2;
    str r1, [r0]
    BX   lr         ; Return.
}

int main(void)
{
    int x=0xfffff, y=0xffff;
    int z;

    MUL_F1(&z, x, y);
}

Go to the top of the page
 
+Quote Post
drum1987
сообщение Mar 21 2011, 12:34
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 255
Регистрация: 3-02-09
Из: Омск
Пользователь №: 44 323



Спасибо. Сделал как написали все заработало cheers.gif
Но еще остался один вопрос:
Собственно в асм я полез в надежде ускорить выполнение программы, и попытался "ускорить" простые функции например функция умножения 32 на 32 бит и результат 32 бит:

#define MUL_F(A,B ) (real_t)(((int64_t)(A)*(int64_t)(B )+(1 << (31))) >> 32) // так она была сделана до меня

я сделал функцию:

static INLINE __asm real_t MUL_F(real_t x, real_t y)
{
smull r0, r1, r0, r1;
lsr r1, #31;
add r0, r0, r1;
lsl r0, #1;
mul r0, r1, #2;
BX lr ; Return.
}


в итоге проиграл 30 процентов(естественно при включении оптимизации по времени выполнения программы). Получается действительно компилятор в данном случае царь и бог или я чтото не так делаю?

Сообщение отредактировал drum1987 - Mar 21 2011, 12:34
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 21 2011, 13:49
Сообщение #18


Гуру
******

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



Цитата(drum1987 @ Mar 21 2011, 15:34) *
Получается действительно компилятор в данном случае царь и бог или я чтото не так делаю?

С умножением компилятору точно не следует "помогать". Посмотрите и сравните дизассемблированный текст в обоих случаях.
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 21 2011, 14:04
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(drum1987 @ Mar 21 2011, 15:34) *
в итоге проиграл 30 процентов(естественно при включении оптимизации по времени выполнения программы). Получается действительно компилятор в данном случае царь и бог или я чтото не так делаю?

Оптимизацию делают не так. Вот правильная методология:
1) Испытываем программу. Смотрим, хватает ли скорости.
2) Если не хватает, ищем медленные куски кода, собирая объективную информацию (время выполнения кусков кода).
3) Возможно, применение другого алгоритма позволит вписаться в требования по скорости выполнения.
4) Если ясно, что переписывание небольшого куска кода на ассемблере по-видимому позволит вписаться в требования по скорости выполнения, то так и делаем.

Если пропустите шаги 1-3, то рискуете потратить кучу времени на оптимизацию, которая не даст никакого полезного результата.
В данном случае потраченное время можно списать на изучение средств разработки.
Ну и, как заметил aaarrr, не нужно соревноваться с компилятором в умножении, от это и так хорошо умеет делать.
Go to the top of the page
 
+Quote Post

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

 


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


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