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

Ασκηση σε assembly


anvc

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

Δημοσ.

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

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

  • Απαντ. 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 που κάνεις δεν μπορεί να ξεχωρίσει εάν ο αριθμός είναι θετικός ή αρνητικός.

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

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

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