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

 
 
> Сви прерывания в 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
 
Start new topic
Ответов
vova7890
сообщение Nov 26 2010, 20:46
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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   Сви прерывания в 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   Вот что происходит: Код char *temp = (char*...   Nov 26 2010, 07:39
|- - Сергей Борщ   QUOTE (vova7890 @ Nov 26 2010, 09:39) я е...   Nov 26 2010, 13:49
- - vova7890   Я пробовал уже наверно все что можно, спасибо коне...   Nov 26 2010, 22:12


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

 


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


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