Autor Thema: Jmp oder Call  (Gelesen 7111 mal)

bscreator

  • Gast
Gespeichert
« am: 19. June 2004, 11:21 »
Hi Leute,

was ist der Unterschied beim Aufrufen eines Labels durch jmp oder call ?

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #1 am: 19. June 2004, 11:50 »
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...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #2 am: 19. June 2004, 12:16 »
du meinst den IP = Instruction Pointer
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #3 am: 19. June 2004, 12:28 »
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.
----------------------
Redakteur bei LowLevel

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #4 am: 19. June 2004, 14:47 »
Zitat
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...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #5 am: 19. June 2004, 14:47 »
und genau das gleiche...
(dumm, dass es kein edit gibt!)
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #6 am: 19. June 2004, 15:15 »
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
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #7 am: 19. June 2004, 16:16 »
ok, stimmt, aber von der logik her währe es gleich...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #8 am: 19. June 2004, 17:00 »
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.

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 19. June 2004, 18:12 »
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 ;) )
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #10 am: 19. June 2004, 18:51 »
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.

mastermesh

  • Beiträge: 341
    • Profil anzeigen
    • http://www.kostenloser-laptop.de/
Gespeichert
« Antwort #11 am: 19. June 2004, 19:50 »
Soweit ich weiß, kann man gar nicht direkt auf den Instruction Pointer zugreifen (mein NASM produziert einen Error beim Assemblieren).

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 19. June 2004, 19:58 »
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.

gurru

  • Beiträge: 42
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 19. June 2004, 22:14 »
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

bscreator

  • Gast
Gespeichert
« Antwort #14 am: 19. June 2004, 22:20 »
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 ?

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #15 am: 19. June 2004, 22:22 »
@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.

gurru

  • Beiträge: 42
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 20. June 2004, 03:57 »
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

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #17 am: 20. June 2004, 14:50 »
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.

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #18 am: 20. June 2004, 16:12 »
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.
----------------------
Redakteur bei LowLevel

 

Einloggen