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

Assembly sos


vassterg

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

Υπάρχει κάποιο να γνωρίζει βασικά πράγματα από assembly?το πρόβλημα είναι το εξής :

 Αντιστροφή της σειράς των bits (3 άτομα)
Δίνεται ένας πίνακας 1000 αριθμών ΙΝΤ (προσημασμένοι των 2 bytes) στην SRAM. Να
γραφεί πρόγραμμα το οποίο να αντιμεταθέτει ανά δύο τα bits εκτός από το πρόσημο. Για
παράδειγμα, 0abcdefg:hijklmno → 0onmlkji:hgfedcba

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Καλημέρα !

 Όταν ήμουν κι εγώ στο πανεπιστήμιο είχα παιδευτεί πολύ με την assembly γι' αυτό καταλαβαίνω την κατάσταση απόλυτα. Εκείνο όμως που πρέπει να γνωρίζεις είναι ότι, λόγω του ότι η γλώσσα αυτή είναι χαμηλού επιπέδου γλώσσα, ο κάθε επεξεργαστής έχει την εντελώς δική του εκδοχή assembly.
 Άρα λοιπόν όταν ζητάς βοήθεια σε τέτοια γλώσσα, θα πρέπει να προσδιορίζεις ακριβώς για ποιο είδος assembly πρόκειται. Αλλιώς η εκφώνηση είναι ημιτελής.
 Αυθαίρετα θα υποθέσω λοιπόν ότι πρόκειται για την assembly του επεξεργαστή 8086, μόνο και μόνο για να μπορέσω να προχωρήσω. Αυτή την εκδοχή της γλώσσας τη διαλέγω επειδή είναι γενικά δημοφιλής για διδακτικούς σκοπούς και επιπλέον επειδή παλιά είχα τον Amstrad 1640 με επεξεργαστή 8086 κι επομένως πάνω-κάτω γνωρίζω την αρχιτεκτονική του.
 Η αρχιτεκτονική του 8086 ορίζει ότι η κάθε θέση μνήμης μπορεί ν' αποθηκεύσει αριθμούς των οκτώ bit. Εδώ τα δεδομένα εισόδου είναι 16 bit συνολικά και επομένως θα πρέπει να είναι αποθηκευμένα σε δύο διαφορετικές θέσεις μνήμης. Αν είχαμε το πλήρες κείμενο της εκφώνησης θα μας όριζε σε ποιες θέσεις ακριβώς έχουν αποθηκευτεί, ή τέλος πάντων από πού θα τα διαβάσουμε.
 Θ' αναγκαστώ και πάλι αυθαίρετα να υποθέσω ότι το πρώτο byte βρίσκεται στη θέση 1000 και το άλλο στη θέση 1001. Αφού λοιπόν κατασκευάσαμε όσα δεδομένα λείπουν απ' την εκφώνηση, ας ξεκινήσουμε να σκεπτόμαστε τον κώδικα.
 Η πρώτη εντολή πρέπει απλά να λέει «φόρτωσε τα περιεχόμενα της θέσης 1000 σ' έναν καταχωρητή γενικού σκοπού». Ποιος είναι ο πιο γνωστός καταχωρητής γενικού σκοπού του 8086 ; Είναι ο AX και έχει χωρητικότητα 16 bit συνολικά. Αποτελείται από τους καταχωρητές AH & AL (υψηλής τάξης byte και χαμηλής τάξης byte αντιστοίχως). Η εντολή για να φορτώσουμε τα περιεχόμενα μιας θέσης μνήμης σε κάποιον καταχωρητή είναι η MOV και πάντα πρέπει να θυμόμαστε ότι ο αύξων αριθμός θέσης μνήμης μπαίνει σε αγκύλη.

MOV AL,[1000]
MOV AH,[1001]

Η αντιστροφή μπορεί να γίνει με την χρήση της εντολής ROL ας πούμε ανά 4 bit ως εξής :

ROL AL,4
ROL AH,4

Τελικά η αποθήκευση μπορεί να γίνει στις ίδιες θέσεις μνήμης ως εξής :

MOV [1000],AH
MOV [1001], AL

Υπάρχει κάτι τελευταίο που πρέπει οπωσδήποτε να πω. Η τελευταία εντολή κάθε προγράμματος assembly πρέπει πάντα να διασφαλίζει ότι το πρόγραμμα θα παραδώσει τα ηνία στο «μητρικό» πρόγραμμα και δεν θα κολλήσει. Συνήθως πρόκειται για το λειτουργικό σύστημα. Αυτή η εντολή στην Assembly του 8086 λέγεται RET.

Ο Άσπρος Γάτος

Επεξ/σία από White_Cat
  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
2 ώρες πριν, GReaperEx είπε

Τι "assembly" όμως? x86, 86k, MIPS, AVR?...

Avr ATmega32A προσομοιωτης.

1 ώρα πριν, White_Cat είπε

Καλημέρα !

 Όταν ήμουν κι εγώ στο πανεπιστήμιο είχα παιδευτεί πολύ με την assembly γι' αυτό καταλαβαίνω την κατάσταση απόλυτα. Εκείνο όμως που πρέπει να γνωρίζεις είναι ότι, λόγω του ότι η γλώσσα αυτή είναι χαμηλού επιπέδου γλώσσα, ο κάθε επεξεργαστής έχει την εντελώς δική του εκδοχή assembly.
 Άρα λοιπόν όταν ζητάς βοήθεια σε τέτοια γλώσσα, θα πρέπει να προσδιορίζεις ακριβώς για ποιο είδος assembly πρόκειται. Αλλιώς η εκφώνηση είναι ημιτελής.
 Αυθαίρετα θα υποθέσω λοιπόν ότι πρόκειται για την assembly του επεξεργαστή 8086, μόνο και μόνο για να μπορέσω να προχωρήσω. Αυτή την εκδοχή της γλώσσας τη διαλέγω επειδή είναι γενικά δημοφιλής για διδακτικούς σκοπούς και επιπλέον επειδή παλιά είχα τον Amstrad 1640 με επεξεργαστή 8086 κι επομένως πάνω-κάτω γνωρίζω την αρχιτεκτονική του.
 Η αρχιτεκτονική του 8086 ορίζει ότι η κάθε θέση μνήμης μπορεί ν' αποθηκεύσει αριθμούς των οκτώ bit. Εδώ τα δεδομένα εισόδου είναι 16 bit συνολικά και επομένως θα πρέπει να είναι αποθηκευμένα σε δύο διαφορετικές θέσεις μνήμης. Αν είχαμε το πλήρες κείμενο της εκφώνησης θα μας όριζε σε ποιες θέσεις ακριβώς έχουν αποθηκευτεί, ή τέλος πάντων από πού θα τα διαβάσουμε.
 Θ' αναγκαστώ και πάλι αυθαίρετα να υποθέσω ότι το πρώτο byte βρίσκεται στη θέση 1000 και το άλλο στη θέση 1001. Αφού λοιπόν κατασκευάσαμε όσα δεδομένα λείπουν απ' την εκφώνηση, ας ξεκινήσουμε να σκεπτόμαστε τον κώδικα.
 Η πρώτη εντολή πρέπει απλά να λέει «φόρτωσε τα περιεχόμενα της θέσης 1000 σ' έναν καταχωρητή γενικού σκοπού». Ποιος είναι ο πιο γνωστός καταχωρητής γενικού σκοπού του 8086 ; Είναι ο AX και έχει χωρητικότητα 16 bit συνολικά. Αποτελείται από τους καταχωρητές AH & AL (υψηλής τάξης byte και χαμηλής τάξης byte αντιστοίχως). Η εντολή για να φορτώσουμε τα περιεχόμενα μιας θέσης μνήμης σε κάποιον καταχωρητή είναι η MOV και πάντα πρέπει να θυμόμαστε ότι ο αύξων αριθμός θέσης μνήμης μπαίνει σε αγκύλη.

MOV AL,[1000]
MOV AH,[1001]

Η αντιστροφή μπορεί να γίνει με την χρήση της εντολής ROL ας πούμε ανά 4 bit ως εξής :

ROL AL,4
ROL AH,4

Τελικά η αποθήκευση μπορεί να γίνει στις ίδιες θέσεις μνήμης ως εξής :

MOV [1000],AH
MOV [1001], AL

Υπάρχει κάτι τελευταίο που πρέπει οπωσδήποτε να πω. Η τελευταία εντολή κάθε προγράμματος assembly πρέπει πάντα να διασφαλίζει ότι το πρόγραμμα θα παραδώσει τα ηνία στο «μητρικό» πρόγραμμα και δεν θα κολλήσει. Συνήθως πρόκειται για το λειτουργικό σύστημα. Αυτή η εντολή στην Assembly του 8086 λέγεται RET.

Ο Άσπρος Γάτος

Ευχαριστω πολυ παιδια κακαρχας που ενδιαφερθηκατε,σε avr studio πρεπει να το κανω σε ATmega32A προσομοιωτη και η αληθεια ειναι οτι ειμαι εντελως ασχετος,μας πεταξε απλα απο μια ασκηση οπως αυτη για να περασουμε εργαστηριο και αγιος ο θεος.Σε avr απαρχει πιθανοτητα να δουλεψει αυτο?περα απο το οτι ξεχασα να πω οτι δουλευω σε avr να πω οτι για εκφωνηση ηταν μονο αυτο.,δε μας εδωσε κατι παραπανω

Επεξ/σία από vassterg
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
Στις 15/5/2020 στις 3:08 ΜΜ, vassterg είπε

Avr ATmega32A προσομοιωτης.

Ευχαριστω πολυ παιδια κακαρχας που ενδιαφερθηκατε,σε avr studio πρεπει να το κανω σε ATmega32A προσομοιωτη και η αληθεια ειναι οτι ειμαι εντελως ασχετος,μας πεταξε απλα απο μια ασκηση οπως αυτη για να περασουμε εργαστηριο και αγιος ο θεος.Σε avr απαρχει πιθανοτητα να δουλεψει αυτο?περα απο το οτι ξεχασα να πω οτι δουλευω σε avr να πω οτι για εκφωνηση ηταν μονο αυτο.,δε μας εδωσε κατι παραπανω

Δε θα δουλέψουν αυτά που σου έγραψε ο φίλος στην περίπτωσή σου.

Παρακολουθείς ένα μάθημα (πώς λέγεται το μάθημα), χωρίς διαφάνειες, χωρίς τίποτα και ο διδάσκων "πέταξε" μια άσκηση χωρίς να έχεις ιδέα τι είναι: datapath, instruction set, pipeline, alu, registers. Το πιο πιθανό είναι να έχεις χάσει κάτι. 

Για αρχή διάβασε εδώ (από τη 46η διαφάνεια και μετά AVR assembly): 

και εδώ: http://www.rjhcoding.com/avr-asm-registers.php  

Ίσως σε βοηθήσουν στην άσκηση, αν και σίγουρα καλό είναι να διαβάσεις θεωρία.

 

Για όποιον ενδιαφέρεται για hardware (υλικό/αρχιτεκτονική υπολογιστών/assembly) και έχει χρόνο μπορεί, να διαβάσει περισσότερα στο μάθημα Οργάνωση Υπολογιστών 2ου έτους σπουδών, του τμήματος Επιστήμης Υπολογιστών στην Κρήτη. Το μάθημα είναι ανοικτό (ασχολείται με RISC-V) και ο διδάσκων είναι (υπεύθυνος υλοποίησης και εκ των σχεδιαστών της RISC II) Μανώλης Κατεβαίνης.

Περιγραφή μαθήματος, προτεινόμενα βιβλία, άλλα ανοικτά μαθήματα του τμήματος σχετικά με το υλικό υπολογιστών:  https://www.csd.uoc.gr/~hy225/20a/intro.pdf

Σελίδα μαθήματος με τις ασκήσεις/σύντομες σημειώσεις/διαλέξεις: https://www.csd.uoc.gr/~hy225/

 

Επεξ/σία από marios28
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...