mips_assembly — συγκεντρωτικός οδηγός — DedSec Project
mips_assembly — συγκεντρωτικός οδηγός MIPS assembly Τι προσφέρει η γλώσσα Η MIPS assembly δείχνει πράξεις σε registers, branches και ρητή προσπέλαση μνήμης αντί για μεταβλητές υψηλού…
MIPS assembly
Τι προσφέρει η γλώσσα
Η MIPS assembly δείχνει πράξεις σε registers, branches και ρητή προσπέλαση μνήμης αντί για μεταβλητές υψηλού επιπέδου.
Μικρό παράδειγμα προς μελέτη
# Illustrative MIPS32 fragment
li $t0, 4
li $t1, 5
addu $t2, $t0, $t1
Υπολόγισε τις τιμές των registers και σύγκρινε το addu με το add ως προς το overflow. Χρησιμοποίησε emulator της σωστής ISA.
Τι να επαληθεύσεις
Κατάγραψε την πραγματική έκδοση εργαλείου, τις απαιτούμενες εξαρτήσεις και την έξοδο σε δοκιμαστικά δεδομένα για τη MIPS_Assembly. Πρόβλεψε το αποτέλεσμα πριν το ελέγξεις και διατήρησε την αρχική και τη διορθωμένη εκδοχή ώστε να φαίνεται η αιτιώδης διαφορά. Μην αποκαλείς ένα απόσπασμα εκτελεσμένο αν δεν έχεις το κατάλληλο περιβάλλον.
Παγίδα ειδική για το θέμα
Pseudo-instructions όπως li μεταφράζονται σε πολλές πραγματικές εντολές· τα delay slots εξαρτώνται από την ISA.
Εργαστήριο εξάσκησης: MIPS Assembly
Αριθμητικός υπολογισμός σε συγκεκριμένο περιβάλλον
Χρησιμοποίησε MIPS32 εκπαιδευτικό simulator με υπηρεσίες τύπου MARS. Δεν πρόκειται για καθολικό κώδικα Linux MIPS syscalls:
.text
.globl main
main:
li $t0, 3
sll $t1, $t0, 1
move $a0, $t1
li $v0, 1
syscall
li $v0, 10
syscall
Η πράξη τοποθετεί 6 στον $t1 και κατόπιν στον $a0 για εμφάνιση ακέραιου. Το $v0 επιλέγει υπηρεσία εκτύπωσης και μετά τερματισμού βάσει του συγκεκριμένου simulator. Κατέγραψε έκδοση και λειτουργία του εργαλείου. Μην υποθέτεις ότι οι αριθμοί υπηρεσιών ισχύουν στο κανονικό Linux ABI.
Πραγματικές και ψευδοεντολές
Οι li και move είναι συνήθως assembler pseudoinstructions. Η sll κάνει μετατόπιση bits προς τα αριστερά και για τη θετική τιμή 3 δίνει 6. Εξέτασε το assembly listing για πιθανή επέκταση ψευδοεντολών και παρακολούθησε τις τιμές κάθε register. Ο αριθμός γραμμών πηγής δεν ισοδυναμεί πάντα με πλήθος εκτελεσμένων machine instructions.
Όρια και αποτυχίες
Άλλαξε την τιμή σε 0 και -1. Σκέψου τη μετατόπιση πάνω σε bit patterns και όχι ως ασφαλή μαθηματικό πολλαπλασιασμό για κάθε ακραία signed τιμή. Γράψε σκόπιμα λάθος όνομα καταχωρητή και κράτησε το assembler error. Είναι διαφορετικό από πρόγραμμα που μεταγλωττίζεται αλλά υπολογίζει λάθος τιμή.
Αυτόνομη άσκηση
Υλοποίησε loop που αθροίζει 1 έως 5 με counter, branch και accumulator. Ιχνηλάτησε πρώτη και τελευταία διακλάδωση και επιβεβαίωσε αποτέλεσμα 15. Εξήγησε αν ο simulator σου χρησιμοποιεί branch delay slots και πώς επηρεάζουν το trace. Τεκμηρίωση: https://www.cs.cornell.edu/courses/cs3410/2008fa/MIPS_Vol2.pdf
MIPS_Assembly — Διαδρομή ουσιαστικής εξάσκησης
Ένα ελάχιστο άθροισμα σε MARS
Ο MIPS 32-bit assembler χρησιμοποιεί registers όπως $t0, $t1 και $v0. Το παρακάτω είναι προσαρμοσμένο σε εκπαιδευτικό simulator MARS, όπου συγκεκριμένοι αριθμοί syscall ενεργοποιούν υπηρεσίες εκτύπωσης και τερματισμού. Δεν είναι κατ' ανάγκη Linux MIPS binary ή κοινό ABI για κάθε simulator.
.text
.globl main
main:
li $t0, 3
li $t1, 5
addu $t2, $t0, $t1
move $a0, $t2
li $v0, 1
syscall
li $v0, 10
syscall
Το πρόγραμμα αναμένεται να τυπώσει 8 και να τερματίσει. Η addu δεν εγείρει signed arithmetic overflow exception όπως η add, παρότι οι τιμές που χειρίζεται είναι bit patterns σε registers. Η li είναι συχνά assembler pseudoinstruction που μπορεί να απαιτεί περισσότερες πραγματικές εντολές.
Έλεγχος μηχανικής αναπαράστασης
Δες στον simulator τις πραγματικές instructions μετά την expansion των pseudoinstructions. Εξήγησε γιατί ένα load από μνήμη χρειάζεται διεύθυνση βάσης και offset, ενώ το register-register addu δεν προσπελάζει το data memory. Μη θεωρείς ότι οι εντολές branch και delay slot συμπεριφέρονται ταυτόσημα σε όλα τα MIPS ISA revisions και simulator settings.
Ελεγχόμενο λάθος
Άλλαξε το syscall number σε άγνωστη υπηρεσία του MARS και παρατήρησε το diagnostic. Κατέγραψε simulator version και mode. Απόφυγε να μεταφέρεις αυτόματα τους MARS service numbers σε Linux: εκεί η σύμβαση system calls είναι διαφορετική.
Εξάσκηση
Αποθήκευσε δύο τιμές σε data segment, φόρτωσέ τις με κατάλληλη instruction, πρόσθεσέ τες και τύπωσε το αποτέλεσμα. Δοκίμασε ένα ζευγάρι τιμών κοντά στα όρια 32-bit και ερμήνευσε unsigned vs signed προβολή. Παράδωσε register trace, αναμενόμενη και παρατηρημένη έξοδο και τις ακριβείς επιλογές του emulator. Το παρόν υλικό δεν ισχυρίζεται πραγματική εκτέλεση.