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

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

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

  • 0
galil

Αλγόριθμος μετατροπής BCD σε binary

Ερώτηση

Υπάρχει κάποιος αλγόριθμος μετατροπής ενός bcd σε binary; Όποτε χρειαζόταν μια μετατροπή την έκανα με το μυαλό (μετέτρεπα τον Binary σε δεκαδικό και μετά ήταν εύκολο να γίνει bcd).

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

6 απαντήσεις σε αυτή την ερώτηση

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

BCD to binary (binary εδώ εννοώ την κανονική αναπαράσταση των αριθμών, δεν σημαίνει ότι κάνουμε καμιά ιδιαίτερη μετατροπή σε δυαδικό αριθμό):

0x89 είναι ο δεκαδικός 89 σε BCD μορφή.

 

0x89 AND 0xF => μένει σκέτο το 9.

(0x89 SHR 4) AND 0xF => μένει σκέτο το 8.

8*10 + 9 => βγήκε το δεκαδικό 89, το οποίο φυσικά είναι σε binary μορφή, δηλαδή 0x59.

 

 

Για binary to BCD πρέπει αντί για πολλαπλασιασμούς να κάνεις διαιρέσεις, δηλαδή

89 στο δεκαδικό

89 mod 10 => έμεινε το 9, έχεις το πρώτο nibble,

(89 div 10) mod 10 => έμεινε το 8, έχεις το δεύτερο nibble

κοκ.

Και για να "ενώσεις" τα nibbles κάνεις SHL 4 και OR αντί για AND που χρειαζόταν παραπάνω.

 

(Nibble = 4 bit, δηλαδή ένα δεκαεξαδικό -ή BCD στη συγκεκριμένη περίπτωση- ψηφίο).

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Δε νομίζω ότι χρειάζεται αλγόριθμος, υπάρχουν σχετικές εντολές assembly (FBLD και FBSTP):

http://www.oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_14/CH14-4.html#HEADING4-52

 

Αρκεί στη συνέχεια να κάνεις pop το αποτέλεσμα από την FPU.

 

Αν προτιμάς αλγόριθμο, αρκεί να πολλαπλασιάζεις ή να διαιρείς με το 10 και να παίρνεις το υπόλοιπο.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
Δε νομίζω ότι χρειάζεται αλγόριθμος, υπάρχουν σχετικές εντολές assembly (FBLD και FBSTP):

http://www.oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_14/CH14-4.html#HEADING4-52

 

Αρκεί στη συνέχεια να κάνεις pop το αποτέλεσμα από την FPU.

 

Αν προτιμάς αλγόριθμο, αρκεί να πολλαπλασιάζεις ή να διαιρείς με το 10 και να παίρνεις το υπόλοιπο.

 

Δεν σε πιάνω. Τι εννοείς.

Όσον αφορά τον αλγόριθμο που ζητείται, είναι εφτασφράγιστο μυστικό και δεν μπορείς να τον βρεις ούτε στο google για αυτό μην κάνεις τον κόπο.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

alkisg ευχαριστώ! Δεν ήξερα οτι υπάρχουν αυτές οι εντολές που είναι πολύ χρήσιμες, αλλά και ο αλγόριθμος είναι αρκετά πιο απλός από έναν άλλο που είχα βρει.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

 

Το 10 που λες είναι το δυαδικό 10 (δηλ το 2);

Και οι πράξεις με ποια σειρά θα γίνουν; Επειδή 8-bit δυαδικούς θα χρησιμοποιώ, αυτό που πρέπει να κάνω είναι το εξής:

 

Έστω a=11010001

a=(a/10)mod10;

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
Δεν σε πιάνω. Τι εννοείς.

Όσον αφορά τον αλγόριθμο που ζητείται, είναι εφτασφράγιστο μυστικό και δεν μπορείς να τον βρεις ούτε στο google για αυτό μην κάνεις τον κόπο.

 

Εχμ...

Κι εγώ είχα ακούσει παλιά ότι το μυστικό μετατροπής από BCD σε binary είναι γνωστό μόνο σε μερικούς κλειστούς κύκλους ανώτερων προγραμματιστών, οι οποίοι ορκίζονται σε ότι έχουν ιερό να μην το προδώσουν ποτέ...

Μάλιστα κυκλοφορούσε η φήμη ότι στους ανώτατους κύκλους υπάρχουν αρχιερείς προγραμματιστές που γνωρίζουν τα μυστικά της πρόσθεσης δύο αριθμών καθώς και του μυθικού κώδικα ASCII... :lol:

 

Αλλά τελικά αποδείχτηκε ότι οι παραπάνω φήμες δεν ισχύουν, και ότι μπορούμε να βρούμε τους σχετικούς κώδικες και αλγόριθμους σε εκατομμύρια sites στο Internet, καθώς και σε σχολικά βιβλία... ;)

 

 

Σοβαρά τώρα, δε νομίζω ότι είχε άδικο που ρώτησε ο galil, μπορεί να είχε βρει καμιά περίεργη υλοποίηση assembly που να τον έμπλεξε...

Όσο για τις FBLD και FBSTP, είναι εντολές assembly που μπορούν να χρησιμοποιηθούν για μετατροπές BCD <=> binary, οπότε δε χρειάζεται αλγόριθμος / διαιρέσεις με το 10 / shift by 4 / μάσκες κτλ.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
×
×
  • Δημιουργία νέου...