Naja, das geht eigentlich ganz leicht:
Hier mal ein Beispiel für einen Systemcall, der ebx und ecx addiert:
//Beispiel Interrupt Routine im Kernel
isr_0x30:
mov eax, ebx
add eax, ecx
iret
// Beispiel für eine Interrupt Routine die eine C Funktion aufruft. (GCC übergibt die Rückgabe auch in eax )
isr_0x30_c:
push ecx
push ebx
call _c_handler
pop ebx
pop ecx
iret
// hier darfst du kein eax popen, da es sonst ja wieder verändert wird.
// die c funktion c_handler()
unsigned long c_handler( unsigned long a, unsigned long b ) {
return a + b;
}
// programm
void programm() {
unsigned long result;
asm volatile ( "int $0x30" : "=a" ( result ) : "a" ( 1 ), "b" ( 2 ), "c" ( 3 ) );
// in result steht jetzt die rückgabe
}