You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
25 lines
4.7 KiB
25 lines
4.7 KiB
4 years ago
|
\section{Υλοποίηση}
|
||
|
|
||
|
Στα πλαίσια του εργαστηρίου υλοποιήθηκε συνάρτησης σε ARM Assembly με την παρακάτω υπογραφή:
|
||
|
|
||
|
\colorbox{codebackground}{
|
||
|
\footnotesize\texttt{int generate\_hash( const char *str, const uint8\_t *hashtbl, int *hashptr )}
|
||
|
}
|
||
|
|
||
|
Αρχικά, δόθηκαν ονόματα στους καταχωρητές οι οποίοι χρησιμοποιήθηκαν μέσα στη συνάρτηση ώστε αυτή να είναι πιο εύχρηστοι. Τονίζεται εδώ ότι ο καταχωρητής R0 είναι ο δείκτης (pointer) προς το αλφαριθμητικό (πρώτο όρισμα της συνάρτησης), ο καταχωρητής R1 είναι ο δείκτης προς το lookup table (δεύτερο όρισμα της συνάρτησης), ενώ ο καταχωρητής R3 είναι ο δείκτης προς τον ακέραιο αριθμό στον οποίο θα αποθηκευτεί το αποτέλεσμα της συνάρτησης (τρίτο όρισμα της συνάρτησης).
|
||
|
|
||
|
Για την αποθήκευση και εύρεση των τιμών κατακερματισμού κάθε γράμματος δημιουργήθηκε ένα lookup table που αποθηκεύει στη μνήμη πίνακα με τις τιμές των γραμμάτων σειριακά. Έτσι, για την εύρεση της κατάλληλης τιμής αρκεί ο pointer που δείχνει στον πίνακα να μετακινηθεί τόσες θέσεις όσες η απόσταση του εκάστοτε γράμματος από τον χαρακτήρα A στο ASCII table.
|
||
|
|
||
|
Έπειτα υλοποιήθηκε ένα τμήμα κώδικα με ετικέτα (label) hash\_loop. Ο κώδικας αυτός φορτώνει στη μνήμη το επόμενο γράμμα και μετά από μία σειρά ελέγχων αποφασίζει τη σωστή διαχείριση:
|
||
|
|
||
|
\begin{itemize}
|
||
|
|
||
|
\item Αν ο χαρακτήρας είναι μικρότερος από τον χαρακτήρα ``0'' στο ASCII table ή είναι ίσος με αυτόν, τότε το πρόγραμμα προσπερνάει αυτόν τον χαρακτήρα και πηγαίνει στο label hash\_skip
|
||
|
\item Αν ο χαρακτήρας είναι μικρότερος ή ίσος με το ``9'' στο ASCII table (δηλαδή ο χαρακτήρας είναι 1-9) τότε η τιμή του αφαιρείται από το hash\_val και έπειτα προστίθεται 48 διότι τα αριθμητικά ψηφία στο ASCII table ξεκινούν από το 48
|
||
|
\item Αν ο χαρακτήρας είναι μικρότερος από τον χαρακτήρα ``A'', τότε το πρόγραμμα προσπερνάει τον χαρακτήρα και πηγαίνει στο label hash\_skip
|
||
|
\item Αν ο χαρακτήρας είναι μεγαλύτερος από τον χαρακτήρα ``Z'', τότε το πρόγραμμα προσπερνάει τον χαρακτήρα και πηγαίνει στο label hash\_skip
|
||
|
\item Σε κάθε άλλη περίπτωση (δηλαδή ο χαρακτήρας είναι A-Z), αφαιρούμε την τιμή 65 (η τιμή του ``A'' στο ASCII table) από τον χαρακτήρα ώστε να πάρουμε τη θέση του χαρακτήρα στο lookup table, έπειτα προσθέτουμε στη θέση τη διεύθυνση του lookup table, φορτώνουμε την τιμή της θέσης που έχει υπολογιστεί και την προσθέτουμε στο hash\_val
|
||
|
\end{itemize}
|
||
|
|
||
|
Το τελευταίο τμήμα κώδικα που υλοποιήσαμε είναι αυτό με label hash\_skip. Σε αυτόν τον κώδικα αυξάνουμε την τιμή του pointer του αλφαριθμητικού κατά ένα. Μετά ελέγχουμε αν ο τελευταίος χαρακτήρας που διαβάστηκε είναι ίσος με τον χαρακτήρα NUL (τερματισμός string της C, ``/0'') και αν η ισότητα ισχύει, άρα έχουμε φτάσει στο τέλος του αλφαριθμητικού επομένως μεταφέρουμε το hash\_val στον καταχωρητή r0 ο οποίος είναι ο καταχωρητής που επιστρέφει και επιστρέφουμε από τη συνάρτηση. Ενώ, σε περίπτωση που η ισότητα δεν ισχύει κάνουμε branch εκ νέου στο label hash\_loop.
|