Begriffserklärung?



  • Hy,

    Kann mir jemand einige Begriffe erklären?
    Ich versuche folgenden Code zu verstehen:

    mov bx, '1'
    Main:
        CMP bx, '1'
        JE near test1
    
        call test2
    loop Main
    
    test1:
    ret
    test2
    iret
    

    Was ist der Unterschied zwischen Call... und JMP (JE)...?
    Was bedeutet das NEAR im JMP?
    Was ist der Unterschied zwischen RET und IRET?

    Ich danke vielmals.

    MFG

    RS



  • ReneS schrieb:

    Kann mir jemand einige Begriffe erklären?
    Ich versuche folgenden Code zu verstehen:

    mov bx, '1'
    Main:
        CMP bx, '1'
        JE near test1
        
        call test2
    loop Main
    
    test1:
    ret
    test2
    iret
    

    Der Code dürfte IMHO so ne Menge Ärger machen...dazu erstmal die Begriffe:

    Was ist der Unterschied zwischen Call... und JMP (JE)...?

    Ein CALL ist ein Aufruf einer Unterfunktion, damit man am Ende der UNterfunktion per RET wieder an den AUfrufer zurückkehrt, wird die Rückkehradrfesse aufm Stack zwischengelagert. Ein JMP ist ein SPrung, d.h. man springt irgendwo hin, kann aber NICHT per RET oder ähnlichem zurückkehren.

    Was bedeutet das NEAR im JMP?

    Near bedeutet, dass man im aktuellen Segment bleibt, dazu soltlest du dir genauer die Bedeutung von CS, DS, ES & co. angucken. Für den Moment reicht wohl zu sagen, dass es ein "kurzer" Sprung ist.

    Was ist der Unterschied zwischen RET und IRET?

    RET springt aus Unterfunktionen die mit CALL aufgerufen worden sind, zurück, dazu benötigt es die Rücksprungadrsese, die aufm Stack vom CALL gespeichert wurde. IRET wird benutzt um aus einer Interrupt-Behandlungsroutine (meist im OS) zurückzuspringen und darf auch im prinzip nu aus solchen aufgerufen werden.

    Der Code ist nun aus mehreren Gründen zum Scheitern verurteilt:
    1. per JE, also ein Sprung wird test1 angesteuert. Dort steht aber ein RET, was zum Aufrufer zurückspringen will. Einen Aufrufer gibts bei Sprüngen aber nicht, deswegen wird das Ding sich das nehmen was gerade aufm Stack rumlag und da hinspringen. Und das ist i.A. nicht das was man will 🙂
    2. per CALL near, also einer Funktionsaufruf wird test2 aufgerufen. Dort steht dann aber ein IRET, obwohl es garnicht in einer Interruptbnehandlungsroutine ist. Auch hier wird sich IRET neben einer vom CALL immerhin noch gespeiocherten Rückkehradresse noch andere Werte vom Stack holen, wiederum einfach was gerade da ist, wiederzum Garant für Ärger.

    Ich empfehle dir, dir einen "besseren" Code zu suchen, ich schätze die Einträge in der Assembelr-FAQ sollten da einiges herhalten.



  • Ich danke vielmals.
    Ich habe den Code nur zur beschreibung geschrieben.

    MFG

    RS


Anmelden zum Antworten