Προς το περιεχόμενο

Επεξήγηση κώδικα assemply


Mike_ledis

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα έχω το παρακάτω πρόγραμμα σε 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

Δημοσ.

Καλησπέρα έχω το παρακάτω πρόγραμμα σε 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

Δημοσ.

Δες εδώ και συγκεκριμένα συμβουλέψου την ενότητα "5. Local variables" όπου επεξηγεί σε 3 βήματα την φιλοσοφία του (ίδιου του) κώδικα που παραθέτεις.

 

Υ.Γ.

Δεν είναι assemply αλλά assembly.

Δημοσ.

Δες εδώ και συγκεκριμένα συμβουλέψου την ενότητα "5. Local variables" όπου επεξηγεί σε 3 βήματα την φιλοσοφία του (ίδιου του) κώδικα που παραθέτεις.

 

Υ.Γ.

Δεν είναι assemply αλλά assembly.

Δημοσ.
Δες εδώ και συγκεκριμένα συμβουλέψου την ενότητα "5. Local variables" όπου επεξηγεί σε 3 βήματα την φιλοσοφία του (ίδιου του) κώδικα που παραθέτεις.

 

Υ.Γ.

Δεν είναι assemply αλλά assembly.

 

Ναι το ξέρω οτι αναφέρει εκεί τη λειτουργία του προγράμματος απο εκεί το βρήκα και εγώ....Το θέμα είναι οτι δεν καταλαβαίνω απο εκεί την λειτουργία και θα ήθελα κάποιος να μου πεί την ακριβή κατάσταση των καταχωρητών και της στοίβας κάθε στιγμή μπάς και καταλάβω.

Δημοσ.
Δες εδώ και συγκεκριμένα συμβουλέψου την ενότητα "5. Local variables" όπου επεξηγεί σε 3 βήματα την φιλοσοφία του (ίδιου του) κώδικα που παραθέτεις.

 

Υ.Γ.

Δεν είναι assemply αλλά assembly.

 

Ναι το ξέρω οτι αναφέρει εκεί τη λειτουργία του προγράμματος απο εκεί το βρήκα και εγώ....Το θέμα είναι οτι δεν καταλαβαίνω απο εκεί την λειτουργία και θα ήθελα κάποιος να μου πεί την ακριβή κατάσταση των καταχωρητών και της στοίβας κάθε στιγμή μπάς και καταλάβω.

Δημοσ.

Χωρίς να ξέρω 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

 

Νομίζω κάπως έτσι πάει.. κάποιος με γνώσεις ίσως να σε διαφωτίσει περισότερο..

Δημοσ.

Χωρίς να ξέρω 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

 

Νομίζω κάπως έτσι πάει.. κάποιος με γνώσεις ίσως να σε διαφωτίσει περισότερο..

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...