Argumente eines Unterprogrammes. Wo auf dem Stack?



  • Hallo wieder.

    Ich habe jetzt noch mal ein Frage, und zwar, wenn ich jetzt ein Unterprogramm mit Parametern schreibe, sagen wir mal so:

    print call pascal near, str:word
    uses ax, dx
    ...
    print endp
    

    Jetzt rufe ich dieses via

    call print pascal, offset einString
    

    Ok, was passiert jetzt auf dem Stack?
    Also, ab dem Aufruf des Unterprogrammes:

    Zuerst steht mal die Rücksprungadresse ganz unten bzw kommt als erstes auf den Stack.

    Was kommt jetzt?
    Das pascal gibt ja an, dass das bp - Register auf dem Stack gespeichert werden soll und dem lokalen bp sp zugewiesen werden soll.
    => lokales bp zeigt auf momentanes sp und auf gespeicherten bp.
    Jetzt kann ja sp weiter wachsen und ich habe dann bp sozusagen als basis-adresse, basis-Zeiger

    Also, jetzt liegt mal ganz unten die Rücksprungadresse.
    Kommt dann danach das gesicherte bp - Register auf dem Stack, oder die Argumente? Oder sogar zuerst die mittels uses versehenen Register?

    Gruß
    Alex



  • Schau mal in den FAQ nach, irgendwo hab' ich da auf eine Seite mit den Calling conventions verlinkt. 😉



  • Hallo Nobuo T.

    Ich konnte den link leider nicht finden, aber ich weiß nicht genau ob mir da die Calling conventions weiter helfen... Kann mich aber auch irren. Schaus mir trotzdem nochmal an, dass Thema calling conventions.

    vielleicht könnte doch noch jemand das ein oder andere Wort finden, zu meiner Frage.

    Gruß
    Alex



  • Also, ich habs jetzt einfach mal selber probiert.

    .model small
    
    print proto near pascal, :word
    
    		.data
    message db "Hallo Welt!", 10, 13, "$"
    
    		.code
    		.startup
    
    		invoke print, offset message
    
    		.exit
    
    print proc near pascal, my_str:word
    
    		push ax
    		push dx
    
    		mov dx, [bp]-2
    		mov ah, 9
    		int 21h
    
    		pop dx
    		pop ax
    
    		ret
    print endp
    		end
    

    Wie Ihr seht, verwende ich oben die Proc um ein string auszugeben.
    1.)
    pascal speichert den bp auf den stack und weist dem lokalen bp sp der momentanen Position zu.
    2.)
    nach pascal, also die nächste Aktion auf dem Stack ist dann das ablegen der Variable my_str.
    3.)
    und wie man sieht, bp zeigt auf den Speicher über dem gespeicherten bp.
    [bp]+ würde Richtung Anfang/ersten Eintrag im Stack wandern und [bp]- schlussfogernd nach innen. D.h. wie am Bsp oben zu erkennen, die Argumente werden der Reihe nach im Stack abgelegt.
    =>

    [bp]-4
    

    wäre dann ax...

    Danke
    Alex


Anmelden zum Antworten