|
Сви прерывания в 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
|
|
|
|
|
 |
Ответов
|
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
|
|
|
|
|
Nov 26 2010, 13:49
|

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

|
QUOTE (vova7890 @ Nov 26 2010, 09:39)  я ещё думал такой вариант типа это оптимизатор смотрит что параметры не юзаются и выкидывает их Вот я тоже об этом думал. А если попробовать так: CODE static inline int sprintfa(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), "m" (dst), "m" (mft), "memory" : "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)
|
|
|
|
Сообщений в этой теме
vova7890 Сви прерывания в gcc Nov 20 2010, 07:51 rezident А в документации разве не описаны правила передачи... Nov 20 2010, 19:40 vova7890 че это не рекомендуется? А че лучше будет когда пр... Nov 20 2010, 20:02 rezident Цитата(vova7890 @ Nov 21 2010, 01:02) Как... Nov 20 2010, 20:25  AHTOXA rezident, gcc умеет оптимизировать asm-вставки.
v... Nov 20 2010, 21:40   vova7890 Цитата(AHTOXA @ Nov 21 2010, 00:40) rezid... Nov 21 2010, 06:33 vova7890 Похоже это невозможно, или никто не знает Nov 21 2010, 19:48 vova7890 блин, и тип double неправильно передаётя... Короче... Nov 22 2010, 07:59 klen Цитата(vova7890 @ Nov 22 2010, 10:59) бли... Nov 24 2010, 19:05 vova7890 да вот уже 4-й день никак не придумаю... видимо по... Nov 25 2010, 10:41 Сергей Борщ QUOTE (vova7890 @ Nov 25 2010, 12:41) да ... Nov 25 2010, 11:16 vova7890 КАК РАЗОБРАТЬ ЭТИ ПАРАМЕРТЫ ДЛЯ АСМ ВСТАВКИ!... Nov 25 2010, 13:36 Сергей Борщ QUOTE (vova7890 @ Nov 25 2010, 15:36) КАК... Nov 25 2010, 14:21 vova7890 А вы думаете я так не пробывал? Не совсем так но ч... Nov 25 2010, 17:03 vova7890 Код.text:00000560 EXPORT start
.text:0... Nov 26 2010, 20:46 vova7890 Я пробовал уже наверно все что можно, спасибо коне... Nov 26 2010, 22:12
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|