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

Ασκηση σε assembly


anvc

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

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

Γιατί να μην χρησιμοποίησεις μια ADD για τα πρώτα 16 bit και μετά μια ADC για τα επόμενα;

 

Και για να συμπληρώσω τον gtroza, σύμφωνα με την εκφώνηση, μπορείς να υπολογίσεις δύο ημερομηνίες που έχουν διαφορά ημερών ίση με (2 εις την 16) = 65536 ημέρες...

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

εσύ το έβαλες σε 4 θέσεις (32 bit) αλλά ο αριθμός έχει τέτοιο εύρος ?

γιατί άν έχει εύρος 32 bit, πώς θα χωρέσει σε 16 ?

 

Γιατι επρεπε να πολλαπλασιασω τη θεση μνημης με το 360 που ειναι 16bit, η MUL αναγκαστικα το βαζει σε 32bit. Δεν ξερω πως αλλιως θα μπορουσε να γινει. :o

 

Γιατί να μην χρησιμοποίησεις μια ADD για τα πρώτα 16 bit και μετά μια ADC για τα επόμενα;

 

Δηλαδη πως; Το τελικο αποτελεσμα θα καταχωρειται σε 16bit καταχωρητη;

 

Και για να συμπληρώσω τον gtroza, σύμφωνα με την εκφώνηση, μπορείς να υπολογίσεις δύο ημερομηνίες που έχουν διαφορά ημερών ίση με (2 εις την 16) = 65536 ημέρες...

 

Πανω σ'αυτο δεν υπαρχει προβλημα, ο καθηγητης μου ειπε οτι το προγραμμα θα γινει συμφωνα με αυτα τα ορια.

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

Εφόσον τα 16bit είναι αρκετά, μετά τους πολλαπλασιασμούς (dx:ax) κρατάς μόνο το 16bit κομμάτι, δηλαδή τον ax.

Τον dx τον "πετάς", αφού θα είναι πάντα μηδέν.

 

Π.χ.

ax = 0123

bx = 0010

mul bx

-> dx:ax = 0000:1230

κρατάς τον ax=1230.

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

Αχ τι καλα!! :-)

Λειτουργει... αλλα με ημερομηνιες που η διαφορα των ημερων, μηνων ή χρονων δεν βγαζει αρνητικο.

Για παραδειγμα λειτουργει για αυτες τις ημερομηνιες 04-06-08 και 02-04-03 και οχι για 04-06-08 και 05-03-11.

 

Ξερετε τι παιζει με αυτη την περιπτωση;

 

Οπως και να 'χει σας ευχαριστω παρα πολυ!!!! :-D

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

Για αρνητικούς πρέπει να χρησιμοποιείς τις αντίστοιχες εντολές, π.χ. imul αντί για mul. Το mul είναι μόνο για θετικούς, το imul γενικά για ακεραίους.

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

Με την IMUL το εκανα... αλλα δε μου βγαζει σωστα αποτελεσματα! Εκει στα ετη κατι παιζει... πχ αντι για -1080 μου βγαζει 27000+κατι. Στο τελος που προσθετω ολες τις ημερες (ημερες+ημερες μηνων+ημερες ετων), αν ειναι καποιες μερες αρνητικος αριθμος, δε θα αφαιρεθει απο το συνολο αντι να προστεθει;

 

*Αντιθετα, αν η διαφορα τους ειναι θετικοι μου τα βγαζει ολοσωστα!

 

παίζει να χρησιμοποιείς τον χρόνο με 4 ψηφία και τους μήνες ως χρόνια -1 και 12+μήνες

,

Τι εννοεις "να χρησιμοποιησω το χρονο με 4 ψηφια"; Η εκφωνηση μου λεει να ειναι 3 byte το συνολο... οποτε δε γινεται. Αν εννοεις αυτο που λεω βεβαια. :)

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

όταν 99 είναι 1999 1899 1799 99 πΧ ?

άρα ποιά είναι η διαφορά 08 - 99 (2008 -1999 ) ?

 

κάτι τέτοιο εννοώ

 

επίσης, μέχρι να βγάλεις αποτελέσματα, μπορείς να χρησιμοποιείς τα 3 bytes ως "προοσωρινή αποθήκη"

ή βάλε τον αριθμό στη στοίβα

 

λέω, αλλά μη ξεχνάς ότι είμαι άσχετος:-D

 

 

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

αλλά να μπορείς να βρίσκεις λύση

χωρίς παρεξήγηση:-)

.

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

Να πω και γώ κάτι;

 

Έχεις δύο ημερομηνίες, την Α και την Β. Τις μετατρέπεις σε ημέρες, που όπως φαίνεται το κάνεις σωστά. Από κει και πέρα υπολογίζεις τη διαφορά (Α-Β). Σωστά;

 

1. Εάν λοιπόν Α>Β τότε ο αριθμός είναι θετικός και όπως φαίνεται σου βγαίνει το αποτέλεσμα που θέλεις.

2. Εάν όμως Α<Β τότε ο αριθμός είναι αρνητικός και θα πρέπει να λάβεις υπόψη σου πως απεικονίζονται οι αρνητικοί στο δυαδικό... Στην προκειμένη περίπτωση (16 bit) το bit 16 θα είναι πάντα 1 και το αποτέλεσμα θα είναι εκφρασμένο ως προς το συμπλήρωμα του δύο... Άρα θα πρέπει να κάνεις κάτι για αυτό...

 

Για την μετατροπή του αρνητικού αριθμού θα πρέπει να εκτελέσεις μια αφαίρεση του αριθμού αυτού από το 65536 ή να εκτελέσεις μια NEG σε αυτόν.

 

Και μια ακόμα παρατήρηση... η IMUL δεν φαίνεται να χρειάζεται, μπορεί να γίνει και με σκέτη MUL, αφού μιλάμε για ημερομηνίες δηλαδή θετικούς αριθμούς...

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

Ο κωδικας μου ειναι αυτος:

 

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.

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

Δηλαδη θα χρειαστει αυτο(αυτα που ειναι με bold);

SUB AL,[203H]

CMP AL,00

JNL COMMON

NEG AL

 

COMMON: MOV [206H],AL

 

Και το ιδιο για τις αλλες 2 αφαιρεσεις...

Σωστα;

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

Όχι δεν είναι ανάγκη να γίνει σε κάθε στάδιο... Στο τελικό αποτέλεσμα θα ελέγξεις το μπιτ 16 αν είναι 1 και αν ναι θα κάνεις το NEG. Το CMP που κάνεις δεν μπορεί να ξεχωρίσει εάν ο αριθμός είναι θετικός ή αρνητικός.

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

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

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


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