ARM v4 Возвращает значение, сохраненное в r0, из функции C, выполняющей вызов SWI - PullRequest
2 голосов
/ 29 сентября 2011

У меня есть функция следующим образом:

int foo()
{
    asm("swi 1");
}

Базовый обработчик для swi 1 правильно помещает возвращаемое значение в r0, я хочу, чтобы foo () правильно возвращала это значение. ARM-ELF-GCC предупреждает о достижении контроля над недействительной функцией для вышеуказанного.

ARM-ELF-GCC по-прежнему предупреждает следующее:

int foo()
{
    asm("swi 1");
    return;
}

Вместо этого я прибег к следующему:

int foo()
{
    int ret_val;
    asm("swi 1");
    asm("mov %[v], r0" : [v]"=r"(ret_val) :: "r0", "r3" )
    return ret_val;
}

Есть ли более элегантный способ заставить GCC возвращать значение в r0, не прибегая к описанному выше?

Спасибо.

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Попробуйте это (работает на gcc):

int foo()
{
    register int ret_val __asm__("r0");
    __asm__ __volatile__ ("swi 1" : "=r"(ret_val));
    return ret_val;
}
0 голосов
/ 29 сентября 2011

если вы собираетесь использовать ассемблер ... тогда ... используйте ассемблер.

.globl foo
foo:
   swi i
   mov pc,lr
...