LINUX.ORG.RU

swi вызовы в gcc

 ,


0

1

Опять выхожу на связь. Есть код, на реалвью (компиляторе) можно делать так

_swi(0x123456) funct(int i, int p); 
и дальше вызывать эту функт. Как сделать так же на gcc? Такое он компилить отказывается.

★★★★★

Последнее исправление: Dudraug (всего исправлений: 1)

наверное, на ассемблере

Harald ★★★★★
()

swi как я помню это обращение к системе?

Что мешает использовать подобное:

__inline__ int swi(int i, int p)
{
	register int pp __asm__("r1") = p;
	register int res __asm__("r0");
	__asm__ volatile ("swi 0x12345" : "=r"(res) : "0"(i), "r"(pp));
	return res;
}

int main()
{
	int a = 2; 
	int b = 5;
	return swi(a, b);
}

Получим:

0000000c <swi>:
   c:   ef012345        svc     0x00012345
  10:   e12fff1e        bx      lr

00000014 <main>:
  14:   e3a01005        mov     r1, #5
  18:   e3a00002        mov     r0, #2
  1c:   ef012345        svc     0x00012345
  20:   e12fff1e        bx      lr

io ★★
()
Ответ на: комментарий от io

Да, если система для конкретного вызова что-то меняет в регистрах или памяти, то не забыть указать в asm побочный эффект. Что-то в стиле : «r12», «cc»); Мне попался случай, когда системный вызов менял память и это не было указано, оптимизатор выкинул фортель.

io ★★
()
Ответ на: комментарий от io

Ага, спасибо, вроде и правда оно, да.

Dudraug ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.