Autor Thema: Return bei Interrupts  (Gelesen 4926 mal)

stafe

  • Beiträge: 35
    • Profil anzeigen
    • http://www.staticos.at.tf
Gespeichert
« am: 23. August 2005, 13:38 »
Hallo,

ich habe folgendes problem ...

Wenn ich in einer externen Anwendung den Systeminterrupt (int 30h) aufrufe, kann ich zwar Funktionen ohne Rückgabewert problemlos ausführen, jedoch keine die einen Rückgabewert haben ... Also ich möchte den Returnwert der Funktion an die Anwendung (die den Interrupt aufgerufen hat) zurückgeliefern ...

Also so rufe ich die Ints über die externen Programme auf:
Hier bekomme ich den Wert in a problemlos im Kernel geliefert.


void test( unsigned int a )
{
    asm("movl %0, %%ebx":: "g"(a));
    asm("movl $0x01, %eax");
    asm("int $0x30");
}


So wie müsste diese funktion aussehen wenn Sie vom kernel einen Rückgabe wert bekäme?


unsigned int test( unsigned int a )
{
    unsigned int b;
    ...
    ...
    ...
    returne(b);
}


Ich hoffe ihr könnt mir helfen ...
mfG Stafe

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #1 am: 23. August 2005, 14:02 »
Hmm!

Wenn es nur ein Rückgabewert ist, könntest du eax nehmen, wäre auf jeden Fall eine Möglichkeit, daher wirst du eax erst sichern müssen, dann den Int aufrufen müssen, den Rückgabewert in eax irgendwohin sichern, und eax wiederherstellen! ;)

Dazu darf dein ISR natürlich nicht auf z.B. popa iret oder ähnlich enden.

Die Implementation überlass ich dir als Fingerübung! ;)
*post*

stafe

  • Beiträge: 35
    • Profil anzeigen
    • http://www.staticos.at.tf
Gespeichert
« Antwort #2 am: 23. August 2005, 14:15 »
Über eax habe ich es schon versucht doch ich bokomme einfach irgend einen wert zurückgegeben ...

Mit eax übergebe ich am anfang die Funktionsnummer (bsp.: 0x01 ist Textausgabe,... ) ... also währe es kein problem eax zu überschreiben um darin den Funktionsrückgabewert zurückzugeben ... doch irgendwie bekomme ich das nicht zum laufen  :roll:  ...
mfG Stafe

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 23. August 2005, 16:39 »
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
}

 

Einloggen