risc_v_assembly — συγκεντρωτικός οδηγός — DedSec Project
risc_v_assembly — συγκεντρωτικός οδηγός RISC-V assembly Έννοια Η RISC-V ISA ξεχωρίζει πράξεις καταχωρητών, load/store και προαιρετικά extensions· έχει σημασία η ακριβής παραλλαγή…
RISC-V assembly
Έννοια
Η RISC-V ISA ξεχωρίζει πράξεις καταχωρητών, load/store και προαιρετικά extensions· έχει σημασία η ακριβής παραλλαγή.
Παράδειγμα πηγαίου κώδικα ή χρήσης
li t0, 7
li t1, 2
add t2, t0, t1
Άσκηση με συγκεκριμένο στόχο
Παρακολούθησε τους καταχωρητές σε simulator συμβατό με RV32/RV64 και σημείωσε τις pseudo-instructions.
Έλεγχος και διάγνωση
Η μη ευθυγραμμισμένη πρόσβαση και το sign extension εξαρτώνται από εντολή και σύστημα· μη μεταφέρεις παραδοχές άλλης ISA.
Σημείωσε την είσοδο, το αναμενόμενο αποτέλεσμα και το πραγματικό αποτέλεσμα στην εγκατεστημένη έκδοση της RISC_V_Assembly. Αν ο κώδικας δεν είναι προσβάσιμος από το κινητό, κράτησε το παράδειγμα ως μη δοκιμασμένο και εξήγησε τη σημασιολογία αντί να ισχυριστείς επιτυχία. Κάνε μια δεύτερη δοκιμή που απομονώνει μόνο τον μηχανισμό της άσκησης και κράτησε ακριβές σφάλμα με τρόπο που να μην εκθέτει προσωπικά δεδομένα.
Εργαστήριο εξάσκησης: RISC V Assembly
Απομονωμένο τμήμα RV32I
Το ακόλουθο είναι fragment εντολών και όχι πλήρες πρόγραμμα Linux ή syscall παράδειγμα:
addi t0, zero, 3
slli t1, t0, 1
add t2, t0, t1
addi zero, t2, 9
Μετά τις τρεις πρώτες εντολές αναμένονται t0=3, t1=6, t2=9. Η τελευταία προσπαθεί να γράψει στον zero (x0), όμως οι εγγραφές σε αυτόν απορρίπτονται και παραμένει μηδέν. Εκτέλεσε βήμα-βήμα σε simulator RV32I και φύλαξε τις πραγματικές τιμές. Ξεχώρισε αρχιτεκτονικούς registers από assembler ονόματα όπως t0. Δεν είναι εκτελέσιμο πρόγραμμα χωρίς κατάλληλο entry/exit.
Immediates και bit μετατοπίσεις
Η addi προσθέτει signed immediate, ενώ η slli μετατοπίζει bits. Δοκίμασε μηδέν και αριθμό κοντά σε όριο signed 32-bit, εξηγώντας την αριθμητική modulo 32 bits αντί για άπειρους μαθηματικούς ακέραιους. Κατάγραψε αν χρησιμοποιείς RV32, RV64 ή compressed instructions: δεν έχουν όλα ίδια encodings ή ορατές τιμές.
Σκόπιμο σφάλμα assembler
Δοκίμασε immediate έξω από το 12-bit signed πεδίο της addi. Κατάγραψε πραγματικό μήνυμα ή τυχόν μετατροπή pseudoinstruction. Οι assemblers διαφέρουν στις διευκολύνσεις που δέχονται και δεν επιτρέπεται να επινοούμε ενιαία διαγνωστική έξοδο.
Αυτόνομο υποπρόγραμμα
Γράψε συνάρτηση RV32I που επιστρέφει τετράγωνο μικρού ακεραίου στον a0, σεβόμενη το ABI και τυχόν callee-saved registers. Έλεγξε μηδέν, αρνητική τιμή και διαθέσιμες επεκτάσεις: η mul ανήκει στην M extension, όχι στη βασική RV32I. Πρότυπο: https://riscv.org/technical/specifications/
RISC_V_Assembly — Διαδρομή ουσιαστικής εξάσκησης
Ένα πρόγραμμα που τερματίζει με συγκεκριμένο status
Για RISC-V Linux η syscall calling convention χρησιμοποιεί a7 για τον syscall number και a0 για το πρώτο όρισμα. Το exit είναι αριθμός 93. Το παράδειγμα αφορά Linux userspace, όχι αυτομάτως κάποιον εκπαιδευτικό simulator ή bare-metal firmware.
.section .text
.globl _start
_start:
li a0, 7
li a7, 93
ecall
Το πρόγραμμα αναμένεται να τερματίσει με status 7. Κατασκεύασε το για κατάλληλο RISC-V GNU target και εκτέλεσέ το σε πραγματικό RISC-V Linux ή ελεγχόμενο emulation. Το ότι ο assembler δέχεται τις εντολές δεν σημαίνει ότι ένα x86 executable μπορεί να εκτελεστεί στον ίδιο πυρήνα χωρίς emulation.
Register conventions
Τα a0..a7 είναι argument registers στο συνήθες RISC-V calling convention, ενώ τα s-registers ανήκουν στους callee-saved σύμφωνα με το ABI. Διαχώρισε τον μηχανισμό απλής κλήσης συνάρτησης από το πέρασμα ορίων kernel syscall. Η instruction ret είναι επίσης pseudoinstruction που αναλύεται σε κατάλληλο άλμα επιστροφής.
Διάγνωση σφάλματος
Αν ο αριθμός syscall είναι άκυρος, ο kernel ακολουθεί το δικό του convention για error reporting· μην υποθέτεις ότι οποιαδήποτε τιμή του a0 είναι exit status. Δημιούργησε χωριστό ασφαλές πείραμα για ένα αναγνωστικό syscall που επιστρέφει error code, χωρίς να αλλάζεις καταστάσεις του συστήματος.
Επιβεβαίωσε τον στόχο
Επιθεώρησε το ELF header και την αρχιτεκτονική του binary πριν τη δοκιμή. Κατάγραψε αν χρησιμοποιείς rv64gc ή άλλο ISA/ABI target και αν ο linker ρύθμισε σωστά το entry point. Χρησιμοποίησε objdump για να δεις τις πραγματικές εντολές που προέκυψαν από το li.
Παραδοτέο
Δώσε source, toolchain version, target triple, exit status και σημείωσε αν υπήρχε QEMU. Σύγκρινε το Linux exit syscall με τις υπηρεσίες ενός simulator όπως RARS, όπου οι αριθμοί και οι παραδοχές μπορεί να διαφέρουν. Μη χαρακτηρίζεις τα δύο περιβάλλοντα εναλλάξιμα.