Woher weiß ich eigentlich den Wert von EIP und ESP vor sysenter? --user94 20:43, 22. Jan. 2010 (CET) :ESP ist meistens das, was du auch im TSS für ESP0 eintragen würdest – und EIP entspricht halt dem Einsprungspunkt im Kernel, bei Syscalls per Interrupt war das eben der Beginn der ISR. Oder meinst du EIP und ESP, wenn zum Programm zurückgekehrt werden soll? Dann macht man wohl am besten ein Label hinter das ''sysenter'' um EIP zu bekommen und ESP kann man ja einfach auslesen. --[[Benutzer:XanClic|XanClic]] 21:58, 22. Jan. 2010 (CET) :Ich meine letzteres. Aber dann muss das Programm ja irgendwie die Rücksprungadresse als Argument mitgeben, weil sie nicht gespeichert wird(beim Aufruf von sysenter). Oder hab ich da was falsch verstanden?--user94 15:53, 23. Jan. 2010 (CET) ::„EIP wird auf den Wert aus EDX gesetzt und ECX wird nach ESP kopiert.“ – das heißt, das Programm muss dem OS irgendwie mitteilen, welche Werte es vor ''sysexit'' in EDX und ECX laden soll. Wie das geschieht, ist OS-abhängig (z. B. kann das eben in ECX und EDX übergeben werden oder in irgendwelchen anderen Registern, oder es ist festgelegt (das Programm müsste in diesem Fall beim Start dem OS mitteilen, wohin nach jedem ''sysenter'' gesprungen werden soll)). In jedem Fall ist es aber implementationsspezifisch – du musst bestimmen, wie diese Argumentübergabe aussehen soll. --[[Benutzer:XanClic|XanClic]] 17:07, 23. Jan. 2010 (CET) Ich hab mir noch mal die Spezifikation angeschaut. Es ist nicht vorgeschrieben, wie genau die Einträge in der GDT auszusehen haben. Es gilt nur. Bei Sysenter: CS = IA32_SYSENTER_CS DS = IA32_SYSENTER_CS + 100b (Zeigt dann auf den Eintrag nach IA32_SYSENTER_CS.) Bei Sysexit: CS = IA32_SYSENTER_CS + 1000b (Zeigt auf den 2. Eintrag nach IA32_SYSENTER_CS.) DS = IA32_SYSENTER_CS + 1100b (Zeigt auf den 3. Eintrag nach IA32_SYSENTER_CS.) Gruß --[[Benutzer:Sannaj|Sannaj]] 18:36, 12. Nov. 2011 (CET)