|
Сви прерывания в 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
|
 |
Ответов
(15 - 17)
|
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)
|
|
|
|
|
Nov 26 2010, 20:46
|
Участник

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

|
Код .text:00000560 EXPORT start .text:00000560 start .text:00000560 .text:00000560 var_10 = -0x10 .text:00000560 .text:00000560 STMFD SP!, {R4,R5,LR} .text:00000564 MOV R5, #0x80; 'А' .text:00000568 SUB SP, SP, #4 .text:0000056C MOV R0, R5 .text:00000570 SWI 0x14 .text:00000574 MOV R4, R0 .text:00000578 MOV R0, R4 .text:0000057C MOV R1, R5 .text:00000580 SWI 0x11D .text:00000584 STR R4, [SP,#0x10+var_10] .text:00000588 SWI 0x16 .text:0000058C MOV R5, R0 .text:00000590 MOV R5, #1 .text:00000594 MOV R0, R5 .text:00000598 MOV R1, R4 .text:0000059C SWI 0x148 .text:000005A0 MOV R5, R0 .text:000005A4 MOV R0, R4 .text:000005A8 SWI 0x15 .text:000005AC BL sub_50C .text:000005B0 MOV R0, #0 .text:000005B4 ADD SP, SP, #4 .text:000005B8 LDMFD SP!, {R4,R5,PC} Код 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) // ругалось на "memory" что нету "memory"(аргумент) : "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc" ); return ret_val; }
Сообщение отредактировал vova7890 - Nov 26 2010, 20:47
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|