Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: bscreator am 19. June 2004, 11:21
-
Hi Leute,
was ist der Unterschied beim Aufrufen eines Labels durch jmp oder call ?
-
also bei call wird das CS register und noch eins auf dem Stackgespeichert, um danach mit ret wieder geladen zu werden, um den programmlauf nach dem call weiter zu führen. bei jmp wird das nicht gemacht, d.h. man kann nicht mit ret wieder zurückspringen...
-
du meinst den IP = Instruction Pointer
-
Mit jmp wird zu einem anderen Programmteil gesprungen. Von dort aus gibt es dann kein direktes Zurück mehr.
MIt Call ruft man eine sog. Unterroutine auf. Diese wird abgearbeitet und dann wird mit ret wieder zu dem Code direkt unter dem Call zurückgesprungen und dort weitergemacht.
-
TeeJay postete
Mit jmp wird zu einem anderen Programmteil gesprungen. Von dort aus gibt es dann kein direktes Zurück mehr.
es sei denn, man hat CS und IP vor dem jump gepusht... dann kann man mit ret zurück, das ist aber nur aufwendiger als calls...
-
und genau das gleiche...
(dumm, dass es kein edit gibt!)
-
Ne nich genau das gleiche: soweit ich weiss kann man ip nicht pushen oder popen ausser mit ret und call und außerdem wären 2*push und einmal ret größer als call und ret
-
ok, stimmt, aber von der logik her währe es gleich...
-
Also sowas wie
push cs
push ds
jmp unter_proc
....
unter_proc:
ret
würde dazu führen, dass unterproc ausgefürhrt wird und mit ret nach jmp unter_proc gesprungen wird. also würde diese dann nochmal aufgerufen, dieses mal aber mit keiner gültigen Rücksprungadresse.
-
nene, du musst ip aufn stack pushen! sonst bist du zwar wieder im selben daten und codesegment, aber du bist evtl. an der falschen stelle vom code, da du ja den instruction pointer nicht wiederhergestellt hast.
so hab ich das ganze jedenfalls verstanden (und so sagt mir meine logik dass es richtig is ;) )
-
Sorry, natürlich ip, ist nur ein schreibfehler. Aber trotzdem tritt der gleiche fehler logiscvherweise auf, da push ip und jmp nicht eine Instruktion sind.
-
Soweit ich weiß, kann man gar nicht direkt auf den Instruction Pointer zugreifen (mein NASM produziert einen Error beim Assemblieren).
-
Ich glaube bei älteren Systemen (oder noch immer?) war das eine ziemliche sicherheitslücke. Konnte man ziemlich leicht mit hilfe eines Bufferoverflows ausnutzen um an jede stelle im Speicher zu springen.
-
hallo
Wenn man ip-pusht gibt es auf jeden fall Probleme, da IP ja auf
JMP marke
zeigt, das heißt nach dem
ret
wirtd dieser Befehl noch einmal ausgeführt. Das nächste return ist dann undefiniert -- also nicht zu empfehlen
@mastermesh:
ich glaube man kann IP auslesen - bin mir aber nicht sicher - aber schreiben geht auf keinen Fall
@another stupid coder:
immer noch eine der häufigsten Sicherheitslücken
-
Dass man mit ret zurückspringen kann, weiß ich schon. Ich meine, ob es da große Unterschiede zwischen der Anzahl der CPU-Takten gibt. Rein aus dem Gefühl heraus denk ich, dass jmp weniger Takte benötigt als call und daher schneller ist.
Stimmt das ?
-
@gurru: Hab ich doch gesagt, dass man nochmal returned, ohne gepushte Adresse
@all:
Also ip kann man schreiben, indem man die Adresse pusht und dann ret ausführt: Man möchte ip = 0x45:
mov ax, 0x45
push ax
ret
So könnte man auch ip lesen, indem man call aufruft und guckt, was auf dem stack ist.
-
hallo
ip kann man nicht direkt auslesen (hab in einer Referenz nachgesehen)
@ bscreator:
Call und Jmp benötigen zum Abarbeiten(Ausführen) nur 1 Takt-wie fast alle Befehle-, bei beiden wird eine Konstante gelesen, das heißt beide Befehle sind gleich schnell
mfg
-
Also call und jmp brauchten bein 8088 damlas noch ca. 20 Takzyklen. Bei neueren Prozesooren liegt der Taktverbrauch bei circa. 5 Takten. Durch die parrallesierung dann bei ungefähr 5/4 Takten (Ist glaube ich beim P3 so) jmp ist wirklich bei vielen Prozessoren um einiges kürzer.
@gurru: Nur die wenigsten Befehle sind beim CISC eintaktisch.
-
Das mit dem einen Takt beim Call kann nicht stimmen.
Es müssen CS und IP (oder eben nur IP) auf den Stack gepusht werden. Und das bedeutet das in den Speicher geschrieben werden kann. Und das läuft nicht in einem Takt.