Int / iret

Hier könnt ihr sowohl zur x86 Architektur als auch zu Win32ASM Fragen stellen.

Moderatoren: crack, Krüsty, Marwin

Beitragvon LittleEndian » Montag 22. November 2004, 21:17

Hallo :)

Ich habe mal eine Verständnisfrage zu dem Befehlspaar Int / iret.
So wie ich das verstanden habe tut zB Int 21h folgendes:


pushf
push cs ;
push ip ; Ich denke mal so arbeitet der "Call"-Befehl
jmp dword ptr 0000h:[21h*4] ;


Jetzt liegt doch aber die Rücksprungaddresse oben auf dem gesicherten Flagword (bzw Dword) auf, deshalb verstehe ich nicht wie es iret schafft die flags zu restoren (popf) und trotzdem CS:IP mit der Rücksprungaddresse zu bestücken.

popf
ret

So kann es nicht gehen, weil das die Rücksprungaddresse ins FlagRegister schreiben und ins Nirvana springen würde.

ret
popf

Würde korrekt ins Programm zurückkehren, aber die Flags nicht zurückschreiben.

Ich habs getestet und das gesicherte Flagregister ist nach dem Call tatsächlich vom Stack verschwunden und SP steht wieder da wo er vor "pushf" gestanden hat. Es funktioniert also tatsächlich irgendwie, aber wie?

Wäre super wenn mich einer aufklären könnte :)
LittleEndian
Newbie
 
Beiträge: 7
Registriert: Montag 22. November 2004, 20:18

Beitragvon Marwin » Montag 22. November 2004, 21:54

Hallo LittleEndian,

der Prozessor holt zunächst den Instruction Pointer, danach den Wert des Code-Segment-Registers, und danach die Flags. Erst danach setzt er die Ausführung an der durch CS:IP angegebenen Adresse fort.

Grüße,
Marwin
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon LittleEndian » Montag 22. November 2004, 22:59

Du meinst innerhalb des Interrupts oder?
Wenn der Prozessor aber IP und CS vom Stack holt kann er danach nichtmehr die Flags holen weil er bei dem Befehl "popf" nie ankommt, denn der IP zeigt ja im nächsten Takt auf den Befehl direkt unter der Call-Anweisung. Oder hab ich dich nicht richtig verstanden?
LittleEndian
Newbie
 
Beiträge: 7
Registriert: Montag 22. November 2004, 20:18

Beitragvon Marwin » Dienstag 23. November 2004, 15:25

Ja, du hast mich falsch verstanden. Der Prozessor arbeitet nicht wie ret | popf oder popf | ret, sondern er holt sich zuerst die Werte, und setzt danach die Ausführung an der Adresse CS:IP. Dies passiert alles in einem Schritt.

Grüße, Marwin
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon LittleEndian » Dienstag 23. November 2004, 21:51

Achso. Naja ich beschäftige mich erst seit einer Woche mit Assembler. Ich denke ich muss noch viel über die Hardware lernen um genau zu kapieren wie das funktioniert. Aber vielen Dank für die schnellen Antworten :)

Mach weiter so!

LittleEndian
LittleEndian
Newbie
 
Beiträge: 7
Registriert: Montag 22. November 2004, 20:18

Beitragvon Nukacola » Mittwoch 24. November 2004, 14:06

Du kannst den Stapel ja auch addressieren. z.B SP+2 auslesen das sind die Flags. Aber das beste ist du liest mal ein wenig Material über stackhandling. CYA
Nukacola
Nukacola
Newbie
 
Beiträge: 3
Registriert: Mittwoch 13. Oktober 2004, 16:18

Beitragvon LittleEndian » Donnerstag 25. November 2004, 09:40

ja, das wusste ich schon aber wenn du [SP+4] einfach ausliest ([SP+2] würde auf IP landen nicht auf den Flags, weil Int einen FAR-Call auslöst) veränderst du den SP nicht und nach RET steht der SP wieder auf den Flags obwohl du bereits zurück im Programm bist. Das heisst du müsstest noch einen Pop-Befehl im Programmcode an den Call hängen und das braucht man nach einem Interruptaufruf ja bekanntlich nicht, also war klar dass diese Möglichkeit wegfällt. Die Rücksprungaddresse von [SP+4] poppen ginge auch nicht weil man SP meines Wissens nach nicht direkt manipulieren darf und selbst wenn das ginge dann hätte man ein 2 Byte grosses "Loch" im Stack (du müsstest für RET ja wieder SP-6 setzen) und müsstest nach dem RET den SP manuell auf SP+2 setzen, was man wie erwähnt erstens nicht darf und zweitens auch bekanntlicherweise nicht machen muss.

So wie Marwin es erklärt hat macht es Sinn, nur den Hardwareprozess dahinter schnall ich noch nicht. Aber kommt noch ;)

thx 4 Comment

LittleEndian
LittleEndian
Newbie
 
Beiträge: 7
Registriert: Montag 22. November 2004, 20:18

Beitragvon LittleEndian » Donnerstag 25. November 2004, 21:55

Ich glaube man kann das Thema hier abschliessen wenn man folgendes weiss:

Iret ist EIN Befehl ,der aus mehreren Takten besteht und als ganzes in den Prozessor geladen wird. Während der einzelnen Takte werden dann IP,CS und die Flags eingelesen. Erst wenn alle Takte abgearbeitet worden sind wird über CS:IP der nächste Befehl geholt und bearbeitet. Genau deshalb macht es nichts, dass CS:IP bereits mit der neuen Addresse bestückt ist obwohl die Flags noch geholt werden müssen.

An dieser Stelle nochmal sorry, dass ich hier alle mit so einer Frage belästigt habe, aber nun weiss ichs so halbwegs :)

Gruss, LittleEndian
LittleEndian
Newbie
 
Beiträge: 7
Registriert: Montag 22. November 2004, 20:18


Zurück zu Assembler

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron