|
Сви прерывания в gcc, переменное количество аргументов?? |
|
|
|
Nov 20 2010, 07:51
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Nov 20 2010, 20:02
|
Участник

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

|
че это не рекомендуется? А че лучше будет когда при вызове сви сначало будет BL на функцию вызова сви (при этом мучая стек, будет передавать параметры), потом сам сви? Не слишком ли много этапов получится? Как раз таки инлайновый вызов будет куда лучше, для 208 мгц. Документацию читал, ничего подобного не находил, иначе б не спрашивал же.
|
|
|
|
|
Nov 21 2010, 06:33
|
Участник

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

|
Цитата(AHTOXA @ Nov 21 2010, 00:40)  rezident, gcc умеет оптимизировать asm-вставки.
vova7890, а может просто посмотреть дизассемблер вызова функции с переменным числом аргументов? та я знаю как оно пашет просто, напримересли будет 3 аргумента то можно стек не трогать, а если 10 то нужно через стек передавать. Вот застрял я на том что не знаю как сказать гсс что нужно переменные пихать в регисты/стек для вставки. К примеру иар их инлайнит, если дофига аргументов то он сохраняет стек и передаёт параметры уже через стек
Сообщение отредактировал vova7890 - Nov 21 2010, 06:31
|
|
|
|
|
Nov 22 2010, 07:59
|
Участник

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

|
блин, и тип double неправильно передаётя... Короче беда с этими свишками на гсс, сделали б как на иаре прагму #pragma swi_number ...
Сообщение отредактировал vova7890 - Nov 22 2010, 08:00
|
|
|
|
|
Nov 25 2010, 10:41
|
Участник

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

|
да вот уже 4-й день никак не придумаю... видимо по человечески сделать не получится. Нагомнокодить и будет скорость хромать
|
|
|
|
|
Nov 25 2010, 13:36
|
Участник

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

|
КАК РАЗОБРАТЬ ЭТИ ПАРАМЕРТЫ ДЛЯ АСМ ВСТАВКИ!!!!!!!!!!! 100тый раз уже говорю...
|
|
|
|
|
Nov 25 2010, 14:21
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Nov 25 2010, 17:03
|
Участник

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

|
А вы думаете я так не пробывал? Не совсем так но что то подобное делал, гсс вообще не обращает внимание на использоване функции тупо втыкает в код swi 22 и все безовсяких параметров и прочего, вот в этом то и беда... Я в пичали!  шото даже кажется что это уже или баги гсс, или ещё чтото...
|
|
|
|
|
Nov 26 2010, 07:39
|
Участник

Группа: Участник
Сообщений: 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} я ещё думал такой вариант типа это оптимизатор смотрит что параметры не юзаются и выкидывает их, пробовал различные атрибуты оптимизации к вставке шото тоже ничего не выходит
Сообщение отредактировал vova7890 - Nov 26 2010, 07:58
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|