Перейти к содержанию
    

Вызов ассемблерной функции из Си

Где прочитать правила передачи параметров и возврата результатов?

Изменено пользователем 777777

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где прочитать правила передачи параметров и возврата результатов?

Если для техасщины, то вот есть кое-что, а именно для С2000:

http://focus.ti.com.cn/cn/lit/an/spra590/spra590.pdf

http://focus.ti.com/lit/an/spra806/spra806.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если для техасщины, <...>

 

Извиняюсь, забыл написать, что нужен BF537

 

В Compiler Reference

Не смешно. И вообще, вопрос адресовался тем, кто знает ответ.

 

Что касается Compiler Reference, то там есть например такие сообщения:

The run-time model defines some registers as scratch registers and others as preserved or dedicated registers. Scratch registers can be used within the assembly language program without worrying about their previous contents. If more room is needed (or an existing code is used) and you wish to use the preserved registers, you must save their contents and then restore those contents before returning.

 

Это, конечно, очень важно, но хотелось бы знать, какие именно регистры являются scratch, а какие preserved or dedicated. По поводу передачи параметров вообще перл:

A good way to explore how arguments are passed between a C/C++ program and an assembly language subroutine is to write a dummy function in C/C++ and compile it using the IDDE’s Save temporary files option (or the -save-temps command-line switch).

Ну и, типа, посмотреть какой пераметр куда попал.

 

А нет ли в природе более строгого документа, где всё это описано?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А нет ли в природе более строгого документа, где всё это описано?

Так там же эти регистры и описываются: C/C++ run-time model and environmnt. Начиная со стр. 1-343 в pdf версии мануала.

Если кратко, то:

  • dedicated: p6, p7, l0-l3
  • call preserved: p3-p5, r4-r7
  • scratch: p0-p2, r0-r3, lb0-lb1, lc0-lc1, lt0-lt1, astat, a0, a1, i0-i3, b0-b3, m0-m3

В функцию первые три аргумента передаются в r0-r2, последующие на стеке, начиная с fp+0x14.

Возвращаемые значения: r0, если <=32 бит, r0:r1 если >32 и <=64 бит. Если больше 64-х бит - на стеке и указатель на них в p0.

 

PS. Решили таки изобрести велосипед, и написать свой fir на ассемблере? ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так там же эти регистры и описываются: C/C++ run-time model and environmnt. Начиная со стр. 1-343 в pdf версии мануала.

Спасибо, действительно есть. А я искал в "C/C++ and Assembly Interface"

 

PS. Решили таки изобрести велосипед, и написать свой fir на ассемблере? ;)

Да, только не fir, а iir. Я нашел функцию iir() но во-первых, матлаб приводит коэффициенты в диапазон -2...+2, что не влазит в fract16. А во-вторых он выдает еще масштабирующий коэффициент, на который надо умножать результат, а он в функции iir() вообще отсутствует. Кроме того, ему нужен один входной массив и один выходной, а мне хотелось бы обрабатывать данные на месте. Кстати, никто не знает, можно ли в эту функцию подсунуть один и тот же массив и в input и в output?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Немного не в тему, но, возможно, информация пригодится...

...матлаб приводит коэффициенты в диапазон -2...+2, что не влазит в fract16.

К сожалению матлаба сейчас под рукой нет, так что не могу подробно расписать что и где. Но совершенно точно, что матлаб (я использовал FDA Tool) умеет приводить коэффициенты к диапазону [-1...+1[. Проверено неоднократно :) (правда для FIR).

 

Кстати, никто не знает, можно ли в эту функцию подсунуть один и тот же массив и в input и в output?

Мне нужно было подсовывать по одному отсчету (т.е. массивы input и output содержали по одному элементу). Так вот, указание одной и той же переменной на вход и на выход работало нормально. Опять же, это делалось для fir_fr16, но, я думаю, способ работы с параметрами у сходных библиотечных функций одинаков.

 

А вообще реализация IIR на ассемблере есть в VDSPшных исходниках (VDSP50\Blackfin\lib\src\libdsp\iir_fr16.asm). Очень удобно взять это за основу (сам так поступил, когда понадобилось iir_fr32).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К сожалению матлаба сейчас под рукой нет, так что не могу подробно расписать что и где. Но совершенно точно, что матлаб (я использовал FDA Tool) умеет приводить коэффициенты к диапазону [-1...+1[. Проверено неоднократно :) (правда для FIR).

 

Edit/Reorder and Scale Second-Order Sections

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...