gtroza Δημοσ. 3 Ιουνίου 2008 Δημοσ. 3 Ιουνίου 2008 εσύ το έβαλες σε 4 θέσεις (32 bit) αλλά ο αριθμός έχει τέτοιο εύρος ? γιατί άν έχει εύρος 32 bit, πώς θα χωρέσει σε 16 ?
GCMH Δημοσ. 3 Ιουνίου 2008 Δημοσ. 3 Ιουνίου 2008 Γιατί να μην χρησιμοποίησεις μια ADD για τα πρώτα 16 bit και μετά μια ADC για τα επόμενα; Και για να συμπληρώσω τον gtroza, σύμφωνα με την εκφώνηση, μπορείς να υπολογίσεις δύο ημερομηνίες που έχουν διαφορά ημερών ίση με (2 εις την 16) = 65536 ημέρες...
anvc Δημοσ. 3 Ιουνίου 2008 Μέλος Δημοσ. 3 Ιουνίου 2008 εσύ το έβαλες σε 4 θέσεις (32 bit) αλλά ο αριθμός έχει τέτοιο εύρος ?γιατί άν έχει εύρος 32 bit, πώς θα χωρέσει σε 16 ? Γιατι επρεπε να πολλαπλασιασω τη θεση μνημης με το 360 που ειναι 16bit, η MUL αναγκαστικα το βαζει σε 32bit. Δεν ξερω πως αλλιως θα μπορουσε να γινει. Γιατί να μην χρησιμοποίησεις μια ADD για τα πρώτα 16 bit και μετά μια ADC για τα επόμενα; Δηλαδη πως; Το τελικο αποτελεσμα θα καταχωρειται σε 16bit καταχωρητη; Και για να συμπληρώσω τον gtroza, σύμφωνα με την εκφώνηση, μπορείς να υπολογίσεις δύο ημερομηνίες που έχουν διαφορά ημερών ίση με (2 εις την 16) = 65536 ημέρες... Πανω σ'αυτο δεν υπαρχει προβλημα, ο καθηγητης μου ειπε οτι το προγραμμα θα γινει συμφωνα με αυτα τα ορια.
alkisg Δημοσ. 3 Ιουνίου 2008 Δημοσ. 3 Ιουνίου 2008 Εφόσον τα 16bit είναι αρκετά, μετά τους πολλαπλασιασμούς (dx:ax) κρατάς μόνο το 16bit κομμάτι, δηλαδή τον ax. Τον dx τον "πετάς", αφού θα είναι πάντα μηδέν. Π.χ. ax = 0123 bx = 0010 mul bx -> dx:ax = 0000:1230 κρατάς τον ax=1230.
anvc Δημοσ. 4 Ιουνίου 2008 Μέλος Δημοσ. 4 Ιουνίου 2008 Αχ τι καλα!! Λειτουργει... αλλα με ημερομηνιες που η διαφορα των ημερων, μηνων ή χρονων δεν βγαζει αρνητικο. Για παραδειγμα λειτουργει για αυτες τις ημερομηνιες 04-06-08 και 02-04-03 και οχι για 04-06-08 και 05-03-11. Ξερετε τι παιζει με αυτη την περιπτωση; Οπως και να 'χει σας ευχαριστω παρα πολυ!!!!
alkisg Δημοσ. 4 Ιουνίου 2008 Δημοσ. 4 Ιουνίου 2008 Για αρνητικούς πρέπει να χρησιμοποιείς τις αντίστοιχες εντολές, π.χ. imul αντί για mul. Το mul είναι μόνο για θετικούς, το imul γενικά για ακεραίους.
gtroza Δημοσ. 4 Ιουνίου 2008 Δημοσ. 4 Ιουνίου 2008 παίζει να χρησιμοποιείς τον χρόνο με 4 ψηφία και τους μήνες ως χρόνια -1 και 12+μήνες ,
anvc Δημοσ. 4 Ιουνίου 2008 Μέλος Δημοσ. 4 Ιουνίου 2008 Με την IMUL το εκανα... αλλα δε μου βγαζει σωστα αποτελεσματα! Εκει στα ετη κατι παιζει... πχ αντι για -1080 μου βγαζει 27000+κατι. Στο τελος που προσθετω ολες τις ημερες (ημερες+ημερες μηνων+ημερες ετων), αν ειναι καποιες μερες αρνητικος αριθμος, δε θα αφαιρεθει απο το συνολο αντι να προστεθει; *Αντιθετα, αν η διαφορα τους ειναι θετικοι μου τα βγαζει ολοσωστα! παίζει να χρησιμοποιείς τον χρόνο με 4 ψηφία και τους μήνες ως χρόνια -1 και 12+μήνες , Τι εννοεις "να χρησιμοποιησω το χρονο με 4 ψηφια"; Η εκφωνηση μου λεει να ειναι 3 byte το συνολο... οποτε δε γινεται. Αν εννοεις αυτο που λεω βεβαια.
alkisg Δημοσ. 4 Ιουνίου 2008 Δημοσ. 4 Ιουνίου 2008 Ανέβασε τον κώδικα, κάπου έχεις λάθος, όχι απαραίτητα στην imul.
gtroza Δημοσ. 4 Ιουνίου 2008 Δημοσ. 4 Ιουνίου 2008 όταν 99 είναι 1999 1899 1799 99 πΧ ? άρα ποιά είναι η διαφορά 08 - 99 (2008 -1999 ) ? κάτι τέτοιο εννοώ επίσης, μέχρι να βγάλεις αποτελέσματα, μπορείς να χρησιμοποιείς τα 3 bytes ως "προοσωρινή αποθήκη" ή βάλε τον αριθμό στη στοίβα λέω, αλλά μη ξεχνάς ότι είμαι άσχετος το πρόβλημα δεν είναι να βρείς μιά λύση αλλά να μπορείς να βρίσκεις λύση χωρίς παρεξήγηση .
GCMH Δημοσ. 4 Ιουνίου 2008 Δημοσ. 4 Ιουνίου 2008 Να πω και γώ κάτι; Έχεις δύο ημερομηνίες, την Α και την Β. Τις μετατρέπεις σε ημέρες, που όπως φαίνεται το κάνεις σωστά. Από κει και πέρα υπολογίζεις τη διαφορά (Α-Β). Σωστά; 1. Εάν λοιπόν Α>Β τότε ο αριθμός είναι θετικός και όπως φαίνεται σου βγαίνει το αποτέλεσμα που θέλεις. 2. Εάν όμως Α<Β τότε ο αριθμός είναι αρνητικός και θα πρέπει να λάβεις υπόψη σου πως απεικονίζονται οι αρνητικοί στο δυαδικό... Στην προκειμένη περίπτωση (16 bit) το bit 16 θα είναι πάντα 1 και το αποτέλεσμα θα είναι εκφρασμένο ως προς το συμπλήρωμα του δύο... Άρα θα πρέπει να κάνεις κάτι για αυτό... Για την μετατροπή του αρνητικού αριθμού θα πρέπει να εκτελέσεις μια αφαίρεση του αριθμού αυτού από το 65536 ή να εκτελέσεις μια NEG σε αυτόν. Και μια ακόμα παρατήρηση... η IMUL δεν φαίνεται να χρειάζεται, μπορεί να γίνει και με σκέτη MUL, αφού μιλάμε για ημερομηνίες δηλαδή θετικούς αριθμούς...
anvc Δημοσ. 4 Ιουνίου 2008 Μέλος Δημοσ. 4 Ιουνίου 2008 Ο κωδικας μου ειναι αυτος: MOV AX,00 MOV BX,00 MOV CX,00 ;1H AFAIRESI - IMERON MOV AL,[200H] SUB AL,[203H] MOV [206H],AL ;2H AFAIRESI - MINON MOV AL,[201H] SUB AL,[204H] MOV [207H],AL ;3H AFAIRESI - XRONON MOV AL,[202H] SUB AL,[205H] MOV [208H],AL ;;POLLAPLASIASMOS MINON ME TO 30 GIA NA GINOUN MERES MOV AL,[207H] MOV BL,1EH IMUL BL MOV [209H],AX ;POLLAPLASIASMOS XRONON ME TO 360 GIA NA GINOUN MERES MOV BL,[208H] MOV AX,0168H IMUL BX MOV [20BH],AX MOV [20DH],DX ;PROSTHESI IMERON ME TIS IMERES TON MINON MOV BX,[209H] MOV CL,[206H] ADC BX,CX MOV [20FH],BX ;;PROSTHESI TOU PROIGOUMENOU APOTELESMATOS ME TIS IMERES TON XRONON ADC AX,BX ;TO APOTELESMA KATAXOREITAI SE 16BITO KATAXORITI MOV [211H],AX HLT ;TELOS PROGRAMMATOS gtroza... οι ημερομηνιες που καταχωρω πρεπει να ειναι μεγαλυτερες του 2000, δηλαδη αν βαλω 03 εννοειται οτι ειναι 2003.
GCMH Δημοσ. 4 Ιουνίου 2008 Δημοσ. 4 Ιουνίου 2008 Τώρα που είδα τον κώδικα, άκυρη η τελευταία παρατήρηση... για τα υπόλοιπα, επιμένω...
anvc Δημοσ. 4 Ιουνίου 2008 Μέλος Δημοσ. 4 Ιουνίου 2008 Δηλαδη θα χρειαστει αυτο(αυτα που ειναι με bold); SUB AL,[203H] CMP AL,00 JNL COMMON NEG AL COMMON: MOV [206H],AL Και το ιδιο για τις αλλες 2 αφαιρεσεις... Σωστα;
GCMH Δημοσ. 4 Ιουνίου 2008 Δημοσ. 4 Ιουνίου 2008 Όχι δεν είναι ανάγκη να γίνει σε κάθε στάδιο... Στο τελικό αποτέλεσμα θα ελέγξεις το μπιτ 16 αν είναι 1 και αν ναι θα κάνεις το NEG. Το CMP που κάνεις δεν μπορεί να ξεχωρίσει εάν ο αριθμός είναι θετικός ή αρνητικός.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.