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

Ασκηση σε assembly


anvc

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

  • Απαντ. 64
  • Δημ.
  • Τελ. απάντηση

>ADD AX,BX // κάνουμε την πρόσθεση
MOV BX,AX //αντιγράφουμε το αποτέλεσμα
AND ΒX,$8000 // μασκάρουμε τα πρώτα 15 μπιτ και κρατάμε το 16
CMP ΒX,$0000 //αν είναι μηδεν θετικός, αν είναι $8000 αρνητικός (ενδέχεται να μην χρειάζεται αυτό εφόσον με την AND επηρεάζεται το zero flag)
JZ COMMON
NEG AX

COMMON:
τα υπόλοιπα...

 

Ελπίζω να δουλέψει έτσι...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

gtroza... οι ημερομηνιες που καταχωρω πρεπει να ειναι μεγαλυτερες του 2000, δηλαδη αν βαλω 03 εννοειται οτι ειναι 2003.

ναι

αλλά 3 - 99 δίνει -96 και όχι 4 που είναι το σωστό

άρα το πρόβλημα σου είναι ο αλγόριθμος και όχι οι αρνητικοί αριθμοί

 

αν δεν κάνω λάθος φυσικά !

.

αν κατάλαβα καλά τα χρόνια δίνουν πάντα θετική διαφορά

οι μήνες όμως ?

 

άρα θα προσθέτεις 12 μήνες και θα μειώνεις κατα 1 τα χρόνια, για να έχεις σωστό αποτέλεσμα (ώς συνέπεια ενός σωστού συλλογισμού - αλγόριθμου )

και όχι σωστών αριθμητικών πράξεων

 

και με την προϋπόθεση οτι είναι σωστό αυτό που λέω :-D

.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ναι

αλλά 3 - 99 δίνει -96 και όχι 4 που είναι το σωστό

άρα το πρόβλημα σου είναι ο αλγόριθμος και όχι οι αρνητικοί αριθμοί

 

αν δεν κάνω λάθος φυσικά !

.

 

Aυτο που λες, αν δεν κανω λαθος κι εγω, διορθωνεται με την χρηση της εντολης NEG. Γιατι 03-99=-96 και 99-03=96. Δηλαδη αρκει να αλλαχτει το προσημο!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γιατι βαζεις ετη που ειναι μικροτερα του 2000 και με μπερδευεις; :Ρ

Για τα ετη που ειπες... κι αυτα δινουν αρνητικη διαφορα... θα εξαρταται απο την σειρα που θα καταχωρουμε τις δυο ημερομηνιες. Δηλαδη μπορει εγω να καταχωρησω πρωτα το 04-06-08 (στη θεση μνημης 200 με 203) και μετα το 03-05-20 ή και αντιθετα.

Αυτο θα μας βγαλει 04-03=1, 06-12=-06 και 08-20=-18.

 

Ακομα δεν ξερω αν καταλαβα αυτο που λες... sorry! :o

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το πρόβλημα είναι το εξής:

 

;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

...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

παράδειγμα

 

η μία ημερομηνία είναι 30-11-99

η άλλη (μεταγενέστερη) είναι 04-07-08

 

τι θα κάνεις σ'αυτή την περίπτωση ?

 

αυτό είναι το πρόβλημα κατά τη γνώμη μου

 

άρα ή τα κάνεις όλα ημέρες και πάντα έχεις θετική διαφορά

 

ή βρίσκεις τμηματικά τις διαφορές, αλλά δανείζεσαι μέρες απο τους μήνες ή μήνες απο τα χρόνια

 

οπότε οι ημερομηνίες γίνονται

30-11-99 > 30-11-99

04-07-08 > 34-06-08 > 34-18-07

 

για τα χρόνια εσύ αποφασίζεις

αν υπάρχει η περίπτωση που λέω

Γιατι βαζεις ετη που ειναι μικροτερα του 2000 και με μπερδευεις; :Ρ

εντάξει για τα χρόνια , κάνε το 99 00

δεν θέλω να σε μπερδεύω !:mrgreen:

.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

παράδειγμα

 

η μία ημερομηνία είναι 30-11-99

η άλλη (μεταγενέστερη) είναι 04-07-08

 

τι θα κάνεις σ'αυτή την περίπτωση ?

 

αυτό είναι το πρόβλημα κατά τη γνώμη μου

 

Δεν υπαρχει τετοιο προβλημα... γιατι η εκφωνηση της ασκησης γραφει οτι το ετος που θα καταχωρει ο χρηστης θα ειναι μεγαλυτερο του 2000!!! :-)

Ο καθηγητης μου ξεκαθαρισε το συγκεκριμενο... οτι συμφωνα με αυτο (>2000) θα εργαστω στην ασκηση. Καταλαβες;

 

 

EDIT: Γραψε λαθος! Τωρα καταλαβα τι εννοεις! Απ'το τελευταιο edit που εκανες κι εσυ! lol

Να σου πω την αληθεια με μπερδευει πολυ αυτος ο τροπος που διαλεξες... και θα πρεπει να αλλαξω ολο το προγραμμα που εχω φτιαξει μεχρι στιγμης. Δεν εχω το χρονο... αυριο πρεπει να την παραδωσω! :o

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ο emulator δε μου δεχεται το AND AX,$8000... αυτο που ειχα γραψει πριν ηταν λαθος; :o

 

Όταν λες ότι δεν το δέχεται μπορεί να σημαίνει πολλά...

1. το $8000 είναι στο δεκαεξαδικό, μπορεί να πρέπει να δώσεις 32768 στο δεκαδικό.

2. υπάρχει περίπτωση να μη δέχεται την εντολή με όρισμα 16 μπιτ... φόρτωσε έναν άλλο καταχωρητή πχ τον DX με την δεκαδική τιμή και μετά "AND AX,DX".

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μη με βρισετε... εκανα μια ακομη προσπαθεια(αυτα που αλλαξα απο το προηγουμενο ειναι με bold... η λογικη του μου φαινεται σωστη... ειναι ομως; :o):

 

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μα τα CMP AX,00 που έχεις βάλει δεν κάνουν κάτι ουσιαστικό... δεν έχουν την ικανότητα να ελέγξουν πρόσημο... δεν πρόκειται να σου βγάλουν αν ο αριθμός είναι μικρότερος του μηδέν... για αυτήν την δουλειά πρέπει να ελέγχθεί το περισσότερα σημαντικό μπιτ. Δοκίμασέ το όπως σου είπα στο ποστ 32 (και δες και το 42).

 

 

Αλλιώς παραιτούμαι και σκίζω τα πτυχία που δεν έχω (να αυτοσαρκαστώ και λιγάκι, ε; )

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

>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;

 

Να δοκιμασω το σκεπτικο σου να δω μηπως βγει σωστο! :-D

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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


  • Δημιουργία νέου...