Hilfe bei Mini-C Programm -> Stack



  • Hallo,
    ich hätte eine Verständnisfrage zu folgendem Code (Google und sufu sind zu ungenau):

    #include <stdlib.h>
    #include <stdio.h>
    
    long *p2;
    int j;
    
    int main(int argc, char** argv);
    
    void test(int i) {
            char buffer[16];
    
            p2 = (long*)&buffer;
            for (j=0;j<16;j++) buffer[j]= j;
            printf("\nbuffer: %10.8p\n", &buffer);
            printf("i: %d %10.8p\n", i, &i);
            printf("Test: %10.8p\n", test);
            printf("main: %10.8p\n", main);
            printf("Stack:\n");
            for (j=8;j>=0;j--)
                    printf("%10.8p: %10.8p\n",(long*)(p2+j),(long*)(*(p2+j)));
    }
    
    int main(int argc, char** argv) {
            test(16);
    }
    

    Ich habe ein Programm gefunden welches mdie jeweiligen StackAdressen von sich selbst ausgibt.
    Es dient dazu zu verstehen wie Programme auf dem Stack abgelegt werden....
    Mir ist erstens unklar warum p2 vom Typ long ist?
    Zusätzlich ist mir die zweite for-schleife in der methode test unklar?
    irgendwie wird hier der stack ausgegeben...?!?

    Könnte mir jemand vielleicht helfen wie genau dieses oder eben andere Programme auf den Stack gelegt werden ?



  • Hallo guigui,

    bin zwar nicht mehr ganz so fit auf dem gebiebt, aber schaun mehr mal ob wir das hinbekommen...

    Zu eins:
    Der Datentyp long ist gewählt, weil er auf einer 32bit Architektur 4 Byte hat! (probiers mit int, müsste auch funktionieren)

    In der Zweiten for schleife setzt er den Zeiger p2 um 32 byte zurück (8 * 4 byte (die 4 wegen long)). Dann zählt er den pointer um jeweils 4 byte runter und lässt Sie sich ausgeben.

    Zum Stack: (nach meinem Wissen)
    Bei einem Unterprogrammaufruf werden als erstes die Übergabeparameter abgelegt. So wie es in diesem Code aussieht springt er um 8Byte zu weit nach oben...

    Danach kommen Rücksprungaddresse und (schlag mich tot, ich glaube der Befehlszähler bin mir aber nicht sicher)...

    Und dann die lokalen Variablen...

    Gruss
    Tobi



  • vielen dank für die Antwort.
    ich konnte unter google leider nichts genaues finden bezüglich stack.
    Habe ich das richtige verstanden dass bei einem unterprogramm aufruf zuerst in umgekehrter Reihenfolge die parameter auf den stack gelegt werden
    und dann die adresse des unterporgamms
    und dann der base pointer ?
    und dann der stack pointer ?

    Ich komme da total durcheinander. Wozu dient genau der Instruction pointer.....? oder der base pointer?





  • Wie das gemacht wird, ist in der jeweiligen ABI für die Plattform spezifiziert. Die Parameter in umgekehrter Reihenfolge und dann die Rücksprungadresse ist ziemlich universell. Danach kommt meistens der Pointer auf den vorigen Stackframe, muss aber nicht sein.



  • c.rackwitz schrieb:

    http://www.phrack.org/show.php?p=49&a=14

    Danke für den Link. Ist super um sich auf dem Gebiet wieder fit zu machen! 👍


Anmelden zum Antworten