kostenloser Webspace werbefrei: lima-city


Assembler - CALL beeinträchtigt Stapelspeicher

lima-cityForumProgrammiersprachenSonstige Programmiersprachen

  1. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Ich habe die Erfahrung gemacht, dass der
    CALL
    Befehl den Stapel beeinflusst. Lege ich beispielsweise eine Zahl darauf ab, rufe eine Prozedur auf und versuche dann in derselben die Zahl vom Stapel zu erhalten, kommt eine andere Zahl zum Vorschein:
    mov ecx,15
    push ecx
    CALL prozedur
    ; ...
    prozedur:
    pop ecx
    cmp ecx,15
    ; ...
    ret
    Hier ist das Register verschieden von 15, im Gegensatz zu:
    mov ecx,15
    push ecx
    JMP prozedur
    ; ...
    prozedur:
    pop ecx
    cmp ecx,15
    Denn hier ist das Register gleich 15.
    Durch etwas Lektüre weiß ich, dass je nach Kontext durch den
    CALL
    Befehl der Befehlszeiger und manchmal auch das Codesegment auf den (?) Stapel gelegt werden, wenn ich jedoch folgendes versuche bricht das Programm ab:
    mov ecx,15
    push ecx
    call prozedur
    ; ...
    prozedur:
    pop si
    pop ecx
    push si
    cmp ecx,15
    ; ...
    ret

    Mir ist immernoch unklar, inwiefern der
    CALL
    Aufruf Einfluss auf den Stapelspeicher nehmen kann, oder ob es dafür einen eigenständigen Befehlsstapel gibt. Und wenn tatsächlich einfach der Befehlszeiger auf den Stapel geschmissen wird, wie kann ich ihn behutsam zwischenspeichern, meine Variablen abholen und den Zeiger dann wieder ablegen?

    Beitrag zuletzt geändert: 7.1.2013 21:23:13 von toolz
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Der Befehl
    call
    legt den Befehlszeiger (
    IP
    -Register) auf den Stack und springt dann zur angegebenen Adresse.
    ret
    macht genau das gegenteil, holt also den Befehlszeiger vom Stack.

    Am einfachsten kannst du auf deine Variablen zugreifen, indem du von
    esp
    aus relativ adressierst… dazu pushst du zuerst
    ebp
    auf den Stack um dort den Stackpointer hinkopieren zu können. Danach greifst du mittels
    [ebp-offset]
    auf die Werte zu.

    Also ungefähr so:
    push	ebp		; ebp sichern
    mov	ebp,esp		; esp zugänglich machen
    ; [ebp] = alter ebp
    ; [ebp-4] = Return-Adresse
    ; [ebp-8] = 1. Parameter (dword)
    push	eax
    mov	eax,[ebp-8]	; 1. Parameter nach eax laden
    ; irgendwas damit anfangen
    pop	eax
    pop	ebp		; ebp zurücksetzen


    Eventuell noch das durchlesen
  4. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!