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

 
 
> Сви прерывания в 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
Ответов (15 - 17)
Сергей Борщ
сообщение Nov 26 2010, 13:49
Сообщение #16


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
vova7890
сообщение Nov 26 2010, 20:46
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
vova7890
сообщение Nov 26 2010, 22:12
Сообщение #18


Участник
*

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



Я пробовал уже наверно все что можно, спасибо конечно всем кто помогает, но ничего не выходит... sad.gif
Go to the top of the page
 
+Quote Post

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

 


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


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