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

 
 
> Сви прерывания в gcc, переменное количество аргументов??
vova7890
сообщение Nov 20 2010, 07:51
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



Долго искал метод запуска сви на гсс, и недавно нашёл одно единственное решение - инлайновая функция с асм встакой. Так вот оно прокатывает когда есть фиксированное количество аргументов, а вот как быть с переменным? К примеру у меня есть функция sprintf(char *dst, char *mft, ...) под номером сви 22, как сделать вызов сви на такое? Вот как я делаю с фиксированным количеством аргументов.

Код
static inline long do_SWI1( const int swi_num,
    long par0)
{
    long ret_val;

    asm volatile (
        "mov r0, %2 \n\t" \
        "swi %1    \n\t" \
        "mov %0, r0 \n\t" \
        :    "=r" (ret_val)
        :    "n" (swi_num), "r" (par0)
        :    "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc"
    );

    return ret_val;
}


В асм вставку можно передавать ва_листы? :-D

Сообщение отредактировал vova7890 - Nov 20 2010, 07:51
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
rezident
сообщение Nov 20 2010, 19:40
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



А в документации разве не описаны правила передачи параметров в/из функции? Кроме того, в очередной раз уведомляю, что асм-овые вставки в Си крайне не рекомендуются. Рекомендуется писать отдельные функции полностью на асм и использовать их в проекте именно как внешние функции. Для этого нужно всего лишь почитать документацию на компилятор.
Go to the top of the page
 
+Quote Post
vova7890
сообщение Nov 20 2010, 20:02
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



че это не рекомендуется? А че лучше будет когда при вызове сви сначало будет BL на функцию вызова сви (при этом мучая стек, будет передавать параметры), потом сам сви? Не слишком ли много этапов получится? Как раз таки инлайновый вызов будет куда лучше, для 208 мгц. Документацию читал, ничего подобного не находил, иначе б не спрашивал же.
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 20 2010, 20:25
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(vova7890 @ Nov 21 2010, 01:02) *
Как раз таки инлайновый вызов будет куда лучше, для 208 мгц.
А кто вам мешает попросить компилятор проинлайнить эту асм-овую функцию? В то же время, оформив ее именно как отдельную функцию, вы не будете вводить компилятор в заблуждение и мешать ему оптимизировать другое окружение той функции, куда вы инлайните асм.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 20 2010, 21:40
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



rezident, gcc умеет оптимизировать asm-вставки.

vova7890, а может просто посмотреть дизассемблер вызова функции с переменным числом аргументов?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
vova7890
сообщение Nov 21 2010, 06:33
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



Цитата(AHTOXA @ Nov 21 2010, 00:40) *
rezident, gcc умеет оптимизировать asm-вставки.

vova7890, а может просто посмотреть дизассемблер вызова функции с переменным числом аргументов?


та я знаю как оно пашет просто, напримересли будет 3 аргумента то можно стек не трогать, а если 10 то нужно через стек передавать. Вот застрял я на том что не знаю как сказать гсс что нужно переменные пихать в регисты/стек для вставки.

К примеру иар их инлайнит, если дофига аргументов то он сохраняет стек и передаёт параметры уже через стек

Сообщение отредактировал vova7890 - Nov 21 2010, 06:31
Go to the top of the page
 
+Quote Post
vova7890
сообщение Nov 21 2010, 19:48
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



Похоже это невозможно, или никто не знает crying.gif
Go to the top of the page
 
+Quote Post
vova7890
сообщение Nov 22 2010, 07:59
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



блин, и тип double неправильно передаётя... Короче беда с этими свишками на гсс, сделали б как на иаре прагму #pragma swi_number ...

Сообщение отредактировал vova7890 - Nov 22 2010, 08:00
Go to the top of the page
 
+Quote Post
klen
сообщение Nov 24 2010, 19:05
Сообщение #9


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(vova7890 @ Nov 22 2010, 10:59) *
блин, и тип double неправильно передаётя... Короче беда с этими свишками на гсс, сделали б как на иаре прагму #pragma swi_number ...


нада подумать! наверняко можно и как обычно наверное красиво и просто но не очевидно.
по сути задача сводится как мне представляется к формированию стека и регистров вызывающими параметрами, номер swi никак к этому не относится - это часть команды а не данные в стеке.
Go to the top of the page
 
+Quote Post
vova7890
сообщение Nov 25 2010, 10:41
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



да вот уже 4-й день никак не придумаю... видимо по человечески сделать не получится. Нагомнокодить и будет скорость хромать
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 25 2010, 11:16
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (vova7890 @ Nov 25 2010, 12:41) *
да вот уже 4-й день никак не придумаю... видимо по человечески сделать не получится. Нагомнокодить и будет скорость хромать
В чем конкретно сложность? Порядок передачи параметров известен. "обычный" printf разбирает параметры в процессе выполнения - что вам мешает подсмотреть и сделать точно так же?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
vova7890
сообщение Nov 25 2010, 13:36
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



КАК РАЗОБРАТЬ ЭТИ ПАРАМЕРТЫ ДЛЯ АСМ ВСТАВКИ!!!!!!!!!!! 100тый раз уже говорю...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 25 2010, 14:21
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (vova7890 @ Nov 25 2010, 15:36) *
КАК РАЗОБРАТЬ ЭТИ ПАРАМЕРТЫ ДЛЯ АСМ ВСТАВКИ!!!!!!!!!!!
Зачем их разбирать в асм-вставке? Вам их надо передать в неизменном виде той функции, которая получит управление после swi. То есть не трогать их вообще. "Я так думаю".
что-то вроде
CODE
static inline int sprintf(char *dst, char *mft, ...)
{
    int ret_val;
    static int const swi_num = 22;
    asm volatile (
        "swi %1    \n\t" \
        "mov %0, r0 \n\t" \
        :    "=r" (ret_val)
        :    "n" (swi_num)
        :    "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc"
    );
    return ret_val;
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
vova7890
сообщение Nov 25 2010, 17:03
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



А вы думаете я так не пробывал? Не совсем так но что то подобное делал, гсс вообще не обращает внимание на использоване функции тупо втыкает в код swi 22 и все безовсяких параметров и прочего, вот в этом то и беда... Я в пичали! biggrin.gif

шото даже кажется что это уже или баги гсс, или ещё чтото...
Go to the top of the page
 
+Quote Post
vova7890
сообщение Nov 26 2010, 07:39
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 19-11-10
Пользователь №: 61 026



Вот что происходит:

Код
  char *temp = (char*)malloc(128);
  zeromem(temp, 128);
  sprintfa(temp, "%s %s", "Hello", "world"); // ваш вариант функции

  ShowMSG (1, (int)temp);
  mfree(temp);
  
  maincsm_onclose(0);


Код
.text:000004C8                 EXPORT start
.text:000004C8 start
.text:000004C8                 STMFD   SP!, {R4,R5,LR}
.text:000004CC                 MOV     R5, #0x80; 'А'
.text:000004D0                 MOV     R0, R5
.text:000004D4                 SWI     0x14
.text:000004D8                 MOV     R4, R0
.text:000004DC                 MOV     R0, R4
.text:000004E0                 MOV     R1, R5
.text:000004E4                 SWI     0x11D
.text:000004E8                 SWI     0x16                ; вот она просто втыкнутая в код свишка
.text:000004EC                 MOV     R5, R0
.text:000004F0                 MOV     R5, #1
.text:000004F4                 MOV     R0, R5
.text:000004F8                 MOV     R1, R4
.text:000004FC                 SWI     0x148
.text:00000500                 MOV     R5, R0
.text:00000504                 MOV     R0, R4
.text:00000508                 BL      sub_8
.text:0000050C                 BL      sub_474
.text:00000510                 MOV     R0, #0
.text:00000514                 LDMFD   SP!, {R4,R5,PC}


я ещё думал такой вариант типа это оптимизатор смотрит что параметры не юзаются и выкидывает их, пробовал различные атрибуты оптимизации к вставке шото тоже ничего не выходит sad.gif

Сообщение отредактировал vova7890 - Nov 26 2010, 07:58
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:30
Рейтинг@Mail.ru


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