anvc Δημοσ. 4 Ιουνίου 2008 Μέλος Δημοσ. 4 Ιουνίου 2008 Πως θα γινει αυτο; Το παρακατω ειναι λαθος; ADC AX,BX CMP ΑΧ,00 JNL COMMON NEG ΑΧ COMMON:MOV [211H],AX HLT ;TELOS PROGRAMMATOS
GCMH Δημοσ. 4 Ιουνίου 2008 Δημοσ. 4 Ιουνίου 2008 >ADD AX,BX // κάνουμε την πρόσθεση MOV BX,AX //αντιγράφουμε το αποτέλεσμα AND ΒX,$8000 // μασκάρουμε τα πρώτα 15 μπιτ και κρατάμε το 16 CMP ΒX,$0000 //αν είναι μηδεν θετικός, αν είναι $8000 αρνητικός (ενδέχεται να μην χρειάζεται αυτό εφόσον με την AND επηρεάζεται το zero flag) JZ COMMON NEG AX COMMON: τα υπόλοιπα... Ελπίζω να δουλέψει έτσι...
anvc Δημοσ. 4 Ιουνίου 2008 Μέλος Δημοσ. 4 Ιουνίου 2008 Ο emulator δε μου δεχεται το AND AX,$8000... αυτο που ειχα γραψει πριν ηταν λαθος;
gtroza Δημοσ. 4 Ιουνίου 2008 Δημοσ. 4 Ιουνίου 2008 gtroza... οι ημερομηνιες που καταχωρω πρεπει να ειναι μεγαλυτερες του 2000, δηλαδη αν βαλω 03 εννοειται οτι ειναι 2003. ναι αλλά 3 - 99 δίνει -96 και όχι 4 που είναι το σωστό άρα το πρόβλημα σου είναι ο αλγόριθμος και όχι οι αρνητικοί αριθμοί αν δεν κάνω λάθος φυσικά ! . αν κατάλαβα καλά τα χρόνια δίνουν πάντα θετική διαφορά οι μήνες όμως ? άρα θα προσθέτεις 12 μήνες και θα μειώνεις κατα 1 τα χρόνια, για να έχεις σωστό αποτέλεσμα (ώς συνέπεια ενός σωστού συλλογισμού - αλγόριθμου ) και όχι σωστών αριθμητικών πράξεων και με την προϋπόθεση οτι είναι σωστό αυτό που λέω .
anvc Δημοσ. 4 Ιουνίου 2008 Μέλος Δημοσ. 4 Ιουνίου 2008 ναιαλλά 3 - 99 δίνει -96 και όχι 4 που είναι το σωστό άρα το πρόβλημα σου είναι ο αλγόριθμος και όχι οι αρνητικοί αριθμοί αν δεν κάνω λάθος φυσικά ! . Aυτο που λες, αν δεν κανω λαθος κι εγω, διορθωνεται με την χρηση της εντολης NEG. Γιατι 03-99=-96 και 99-03=96. Δηλαδη αρκει να αλλαχτει το προσημο!
gtroza Δημοσ. 4 Ιουνίου 2008 Δημοσ. 4 Ιουνίου 2008 δεν εννοούσα αυτό εννοούσα 2003 - 1999 δες αυτό που συμπλήρωσα παραπάνω .
anvc Δημοσ. 4 Ιουνίου 2008 Μέλος Δημοσ. 4 Ιουνίου 2008 Γιατι βαζεις ετη που ειναι μικροτερα του 2000 και με μπερδευεις; :Ρ Για τα ετη που ειπες... κι αυτα δινουν αρνητικη διαφορα... θα εξαρταται απο την σειρα που θα καταχωρουμε τις δυο ημερομηνιες. Δηλαδη μπορει εγω να καταχωρησω πρωτα το 04-06-08 (στη θεση μνημης 200 με 203) και μετα το 03-05-20 ή και αντιθετα. Αυτο θα μας βγαλει 04-03=1, 06-12=-06 και 08-20=-18. Ακομα δεν ξερω αν καταλαβα αυτο που λες... sorry!
alkisg Δημοσ. 4 Ιουνίου 2008 Δημοσ. 4 Ιουνίου 2008 Το πρόβλημα είναι το εξής: ;POLLAPLASIASMOS XRONON ME TO 360 GIA NA GINOUN MERES MOV BL,[208H] MOV AX,0168H IMUL BX MOV [20BH],AX MOV [20DH],DX Αν μετά την αφαίρεση των χρόνων έχει προκύψει αποτέλεσμα FF, αυτό σημαίνει -1, όχι 255. Με τις παραπάνω πράξεις, έχεις BX = 00FF = 255 και το πολλαπλασιάζεις με 360 και άρα βγαίνει κάτι τελείως λάθος. Κοίτα λίγο την εντολή cbw: μετατρέπει ένα byte στο αντίστοιχο signed word, δηλαδή αυτό που θες. Π.χ. mov al,[208h] cbw mov bx,ax mov ax,0168h ...
gtroza Δημοσ. 4 Ιουνίου 2008 Δημοσ. 4 Ιουνίου 2008 παράδειγμα η μία ημερομηνία είναι 30-11-99 η άλλη (μεταγενέστερη) είναι 04-07-08 τι θα κάνεις σ'αυτή την περίπτωση ? αυτό είναι το πρόβλημα κατά τη γνώμη μου άρα ή τα κάνεις όλα ημέρες και πάντα έχεις θετική διαφορά ή βρίσκεις τμηματικά τις διαφορές, αλλά δανείζεσαι μέρες απο τους μήνες ή μήνες απο τα χρόνια οπότε οι ημερομηνίες γίνονται 30-11-99 > 30-11-99 04-07-08 > 34-06-08 > 34-18-07 για τα χρόνια εσύ αποφασίζεις αν υπάρχει η περίπτωση που λέω Γιατι βαζεις ετη που ειναι μικροτερα του 2000 και με μπερδευεις; :Ρ εντάξει για τα χρόνια , κάνε το 99 00 δεν θέλω να σε μπερδεύω ! .
anvc Δημοσ. 4 Ιουνίου 2008 Μέλος Δημοσ. 4 Ιουνίου 2008 παράδειγμα η μία ημερομηνία είναι 30-11-99 η άλλη (μεταγενέστερη) είναι 04-07-08 τι θα κάνεις σ'αυτή την περίπτωση ? αυτό είναι το πρόβλημα κατά τη γνώμη μου Δεν υπαρχει τετοιο προβλημα... γιατι η εκφωνηση της ασκησης γραφει οτι το ετος που θα καταχωρει ο χρηστης θα ειναι μεγαλυτερο του 2000!!! Ο καθηγητης μου ξεκαθαρισε το συγκεκριμενο... οτι συμφωνα με αυτο (>2000) θα εργαστω στην ασκηση. Καταλαβες; EDIT: Γραψε λαθος! Τωρα καταλαβα τι εννοεις! Απ'το τελευταιο edit που εκανες κι εσυ! lol Να σου πω την αληθεια με μπερδευει πολυ αυτος ο τροπος που διαλεξες... και θα πρεπει να αλλαξω ολο το προγραμμα που εχω φτιαξει μεχρι στιγμης. Δεν εχω το χρονο... αυριο πρεπει να την παραδωσω!
alkisg Δημοσ. 4 Ιουνίου 2008 Δημοσ. 4 Ιουνίου 2008 Υ.Γ. αν δεν έχεις assembly instruction set πρόχειρο για να δεις την cbw, εδώ τα έχει αρκετά καλά: http://www.itis.mn.it/linux/quarta/x86/index.htm
GCMH Δημοσ. 4 Ιουνίου 2008 Δημοσ. 4 Ιουνίου 2008 Ο emulator δε μου δεχεται το AND AX,$8000... αυτο που ειχα γραψει πριν ηταν λαθος; Όταν λες ότι δεν το δέχεται μπορεί να σημαίνει πολλά... 1. το $8000 είναι στο δεκαεξαδικό, μπορεί να πρέπει να δώσεις 32768 στο δεκαδικό. 2. υπάρχει περίπτωση να μη δέχεται την εντολή με όρισμα 16 μπιτ... φόρτωσε έναν άλλο καταχωρητή πχ τον DX με την δεκαδική τιμή και μετά "AND AX,DX".
anvc Δημοσ. 4 Ιουνίου 2008 Μέλος Δημοσ. 4 Ιουνίου 2008 Μη με βρισετε... εκανα μια ακομη προσπαθεια(αυτα που αλλαξα απο το προηγουμενο ειναι με bold... η λογικη του μου φαινεται σωστη... ειναι ομως; ): MOV AX,00 MOV BX,00 MOV CX,00 ;1H AFAIRESI - IMERON MOV AL,[200H] SUB AL,[203H] CMP AL,00 JNL IMERES NEG AL IMERES: 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 CMP AX,00 JNL MINES NEG AX MINES: MOV [209H],AX ;POLLAPLASIASMOS XRONON ME TO 360 GIA NA GINOUN MERES MOV BL,[208H] MOV AX,0168H IMUL BX CMP AX,00 JNL ETH NEG AX ETH: 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 PROGRAMMA
GCMH Δημοσ. 4 Ιουνίου 2008 Δημοσ. 4 Ιουνίου 2008 Μα τα CMP AX,00 που έχεις βάλει δεν κάνουν κάτι ουσιαστικό... δεν έχουν την ικανότητα να ελέγξουν πρόσημο... δεν πρόκειται να σου βγάλουν αν ο αριθμός είναι μικρότερος του μηδέν... για αυτήν την δουλειά πρέπει να ελέγχθεί το περισσότερα σημαντικό μπιτ. Δοκίμασέ το όπως σου είπα στο ποστ 32 (και δες και το 42). Αλλιώς παραιτούμαι και σκίζω τα πτυχία που δεν έχω (να αυτοσαρκαστώ και λιγάκι, ε; )
anvc Δημοσ. 4 Ιουνίου 2008 Μέλος Δημοσ. 4 Ιουνίου 2008 >ADD AX,BX // κάνουμε την πρόσθεση MOV BX,AX //αντιγράφουμε το αποτέλεσμα AND ΒX,$8000 // μασκάρουμε τα πρώτα 15 μπιτ και κρατάμε το 16 CMP ΒX,$0000 //αν είναι μηδεν θετικός, αν είναι $8000 αρνητικός (ενδέχεται να μην χρειάζεται αυτό εφόσον με την AND επηρεάζεται το zero flag) JZ COMMON NEG AX COMMON: τα υπόλοιπα... Ελπίζω να δουλέψει έτσι... Αυτο που ειχες γραψει που ακριβως θα μπει; Επισης δεν καταλαβα τι ειναι το 8000, τιμη; Απ'οτι καταλαβα μαλλον ειναι τροπος για να παιρνουμε το 16ο bit, αλλα μπορεις να μου εξηγησεις γιατι εβαλες το 8000; Να δοκιμασω το σκεπτικο σου να δω μηπως βγει σωστο!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.