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