Mike_ledis Δημοσ. 6 Σεπτεμβρίου 2010 Μέλος Δημοσ. 6 Σεπτεμβρίου 2010 Καλησπέρα έχω το παρακάτω πρόγραμμα σε assemply.Έχει φτιαχτεί για να δείχνει την δημιουργία τοπικών μεταβλητών σε καλούμενες συναρτήσεις.Ξέρω πάνω κάτω την λειτουργία των καταχωρητών και της στοίβας απλά δεν καταλαβαίνω τι ακριβώς κάνει αυτό το πρόγραμμα. # _main() start .globl _main # define _main externally _main: call foo ret foo: # preserve old & set new frame pointer (ebp) pushl %ebp # save old ebp movl %esp, %ebp # set new ebp # create a local var on stack, set it to 10 subl $4, %esp # sub 4 from esp to create local var movl $10, -4(%ebp) # set local var -4(%ebp) addl $4, %esp # remove local var space # return old frame pointer and return movl %ebp, %esp popl %ebp ret
Mike_ledis Δημοσ. 6 Σεπτεμβρίου 2010 Δημοσ. 6 Σεπτεμβρίου 2010 Καλησπέρα έχω το παρακάτω πρόγραμμα σε assemply.Έχει φτιαχτεί για να δείχνει την δημιουργία τοπικών μεταβλητών σε καλούμενες συναρτήσεις.Ξέρω πάνω κάτω την λειτουργία των καταχωρητών και της στοίβας απλά δεν καταλαβαίνω τι ακριβώς κάνει αυτό το πρόγραμμα. # _main() start .globl _main # define _main externally _main: call foo ret foo: # preserve old & set new frame pointer (ebp) pushl %ebp # save old ebp movl %esp, %ebp # set new ebp # create a local var on stack, set it to 10 subl $4, %esp # sub 4 from esp to create local var movl $10, -4(%ebp) # set local var -4(%ebp) addl $4, %esp # remove local var space # return old frame pointer and return movl %ebp, %esp popl %ebp ret
Directx Δημοσ. 6 Σεπτεμβρίου 2010 Δημοσ. 6 Σεπτεμβρίου 2010 Δες εδώ και συγκεκριμένα συμβουλέψου την ενότητα "5. Local variables" όπου επεξηγεί σε 3 βήματα την φιλοσοφία του (ίδιου του) κώδικα που παραθέτεις. Υ.Γ. Δεν είναι assemply αλλά assembly.
Directx Δημοσ. 6 Σεπτεμβρίου 2010 Δημοσ. 6 Σεπτεμβρίου 2010 Δες εδώ και συγκεκριμένα συμβουλέψου την ενότητα "5. Local variables" όπου επεξηγεί σε 3 βήματα την φιλοσοφία του (ίδιου του) κώδικα που παραθέτεις. Υ.Γ. Δεν είναι assemply αλλά assembly.
Mike_ledis Δημοσ. 6 Σεπτεμβρίου 2010 Μέλος Δημοσ. 6 Σεπτεμβρίου 2010 Δες εδώ και συγκεκριμένα συμβουλέψου την ενότητα "5. Local variables" όπου επεξηγεί σε 3 βήματα την φιλοσοφία του (ίδιου του) κώδικα που παραθέτεις. Υ.Γ. Δεν είναι assemply αλλά assembly. Ναι το ξέρω οτι αναφέρει εκεί τη λειτουργία του προγράμματος απο εκεί το βρήκα και εγώ....Το θέμα είναι οτι δεν καταλαβαίνω απο εκεί την λειτουργία και θα ήθελα κάποιος να μου πεί την ακριβή κατάσταση των καταχωρητών και της στοίβας κάθε στιγμή μπάς και καταλάβω.
Mike_ledis Δημοσ. 6 Σεπτεμβρίου 2010 Μέλος Δημοσ. 6 Σεπτεμβρίου 2010 Δες εδώ και συγκεκριμένα συμβουλέψου την ενότητα "5. Local variables" όπου επεξηγεί σε 3 βήματα την φιλοσοφία του (ίδιου του) κώδικα που παραθέτεις. Υ.Γ. Δεν είναι assemply αλλά assembly. Ναι το ξέρω οτι αναφέρει εκεί τη λειτουργία του προγράμματος απο εκεί το βρήκα και εγώ....Το θέμα είναι οτι δεν καταλαβαίνω απο εκεί την λειτουργία και θα ήθελα κάποιος να μου πεί την ακριβή κατάσταση των καταχωρητών και της στοίβας κάθε στιγμή μπάς και καταλάβω.
orotoi Δημοσ. 6 Σεπτεμβρίου 2010 Δημοσ. 6 Σεπτεμβρίου 2010 Χωρίς να ξέρω assembly νομίζω απο τα σχόλια που έχει είναι κατανοητό.. foo: # preserve old & set new frame pointer (ebp) pushl %ebp # save old ebp Βάζει στη λίστα τη τιμή του ebp.. movl %esp, %ebp # set new ebp Ορίζει τον ebp να εχει την τιμή του esp # create a local var on stack, set it to 10 Εδώ κάνει χώρο στη λίστα για να χωρέσει η νέα τιμή το l νομίζω είναι για Long και είναι 4bytes. subl $4, %esp # sub 4 from esp to create local var - οπότε λογικά ο δείκτης τώρα δείχνει 4bytes πίσω movl $10, -4(%ebp) # set local var -4(%ebp) addl $4, %esp # remove local var space στο τέλος ο esp δείχνει εκει που έδειχνε αρχικά.. # return old frame pointer and return movl %ebp, %esp popl %ebp ret Νομίζω κάπως έτσι πάει.. κάποιος με γνώσεις ίσως να σε διαφωτίσει περισότερο..
orotoi Δημοσ. 6 Σεπτεμβρίου 2010 Δημοσ. 6 Σεπτεμβρίου 2010 Χωρίς να ξέρω assembly νομίζω απο τα σχόλια που έχει είναι κατανοητό.. foo: # preserve old & set new frame pointer (ebp) pushl %ebp # save old ebp Βάζει στη λίστα τη τιμή του ebp.. movl %esp, %ebp # set new ebp Ορίζει τον ebp να εχει την τιμή του esp # create a local var on stack, set it to 10 Εδώ κάνει χώρο στη λίστα για να χωρέσει η νέα τιμή το l νομίζω είναι για Long και είναι 4bytes. subl $4, %esp # sub 4 from esp to create local var - οπότε λογικά ο δείκτης τώρα δείχνει 4bytes πίσω movl $10, -4(%ebp) # set local var -4(%ebp) addl $4, %esp # remove local var space στο τέλος ο esp δείχνει εκει που έδειχνε αρχικά.. # return old frame pointer and return movl %ebp, %esp popl %ebp ret Νομίζω κάπως έτσι πάει.. κάποιος με γνώσεις ίσως να σε διαφωτίσει περισότερο..
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.