να υλοποιεί την διαίρεση δύο αριθμών των 8 bit

συζητήσεις για assembly

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
petalouditsa2007
Δημοσιεύσεις: 49
Εγγραφή: 10 Μάιος 2007 11:18

να υλοποιεί την διαίρεση δύο αριθμών των 8 bit

Δημοσίευση από petalouditsa2007 » 15 Νοέμ 2007 11:47

θελω την βοηθεια σας σε μια εργασια
μου.
Να κατασκευαστεί πρόγραμμα σε γλώσσα μηχανής του 8088 που να υλοποιεί την διαίρεση δύο αριθμών των 8 bit και να αποθηκεύει το πηλίκο και το υπόλοιπο της διαίρεσης σε δύο θέσεις μνήμης, χωρίς την χρήση των εντολών DIV και IDIV. Στη συνέχεια το παραπάνω πρόγραμμα να υλοποιηθεί ως υπορουτίνα και να κατασκευαστεί κυρίως πρόγραμμα που θα υπολογίζει εκφράσεις της μορφής (Α+Β+C)/(D+E+F). Επίσης να κατασκευαστεί υπορουτίνα που θα ελέγχει αν ένας αριθμός είναι πρώτος.
ευχαριστω!!

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

να υλοποιεί την διαίρεση δύο αριθμών των 8 bit

Δημοσίευση από LightForce » 16 Νοέμ 2007 00:57

Γειά,
Για το τελευταίο που ζητάς να μια πολύ απλή και αργή ρουτίνα, ελεγχει τον αριθμό σου (είσοδος στον BX) με όλους τους ακέραιους ξεκινώντας απο το 2
Εξοδος 0 στον BX αν δεν είναι πρώτος, ο BX μένει όπως είναι αν είναι πρώτος.
Στο δίκτυο θα βρείς καλύτερους αλγόριθμους σε C πάντως, δεν θα είναι δύσκολο να τους μετατρέψεις σε asm.

Κώδικας: Επιλογή όλων

isprime:
	mov cx,2
do:	
	mov ax,bx
	cmp cx,ax			
	je .yes
	xor dx,dx
	div cx
	cmp dx,0
	je .no
	inc cx
	jmp do			
.yes: 	                       
	ret	         
.no:	                         
	xor bx,bx      
	ret
Τα ξαναλέμε..

Άβαταρ μέλους
Rallia
Δημοσιεύσεις: 24
Εγγραφή: 06 Νοέμ 2007 12:36
Τοποθεσία: Σερρες
Επικοινωνία:

να υλοποιεί την διαίρεση δύο αριθμών των 8 bit

Δημοσίευση από Rallia » 16 Νοέμ 2007 09:56

As mantepso:
Tei Serron
Tmhma: Plhroforikhs k Epikoinonion
Mathima: Arxitektonikh Ypologiston
Eksamino:4o h apla tora pires to ergasthrio...

An kano lathos, sorry, alla eimai poli periergh na do pou allou xrhsimopoioun ton 8088 kai exoun idia akrivos ekfonish me ta dikas mas project eksaminou...:D

Parepiptontos an parakoloutheis to ergasthrio, h ergasia ayth einai apo tis pio eukoles... Emas sigekrimena mas eixe dosei sxedon tin apantish sto ergasthrio o Kathigiths.
Εικόνα

Άβαταρ μέλους
telas
Honorary Member
Δημοσιεύσεις: 1594
Εγγραφή: 12 Μαρ 2004 12:54
Τοποθεσία: Kastoria
Επικοινωνία:

να υλοποιεί την διαίρεση δύο αριθμών των 8 bit

Δημοσίευση από telas » 16 Νοέμ 2007 10:12

κάψιμο! :roll: δεν ένιωσα κάστανο λολ
Web Design - Δημιουργία Ιστοσελίδας - http://www.computerman.gr/
My Photography - http://www.tilaveridis.com/
Τεχνολογικά προιόντα - http://www.bigbox.gr/

petalouditsa2007
Δημοσιεύσεις: 49
Εγγραφή: 10 Μάιος 2007 11:18

να υλοποιεί την διαίρεση δύο αριθμών των 8 bit

Δημοσίευση από petalouditsa2007 » 19 Νοέμ 2007 11:12

μπορεις να μου στειλεις
την απαντηση αν σου ειναι
ευκολο???ευχαριστω

petalouditsa2007
Δημοσιεύσεις: 49
Εγγραφή: 10 Μάιος 2007 11:18

να υλοποιεί την διαίρεση δύο αριθμών των 8 bit

Δημοσίευση από petalouditsa2007 » 19 Νοέμ 2007 11:17

την υπορουτινα σε ποιο σημειο
ακριβως του προγραμματος
την γραφω?
ειναι ξεχωριστα απο το ολο
προγραμμα??

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

να υλοποιεί την διαίρεση δύο αριθμών των 8 bit

Δημοσίευση από dva_dev » 19 Νοέμ 2007 14:56

petalouditsa2007 έγραψε:...χωρίς την χρήση των εντολών DIV και IDIV...
LightForce έγραψε:

Κώδικας: Επιλογή όλων

	...
	div cx
	...
Μάλλον δεν μπορεί να χρησιμοποιηθεί.

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

να υλοποιεί την διαίρεση δύο αριθμών των 8 bit

Δημοσίευση από LightForce » 19 Νοέμ 2007 18:31

Διάβασε την άσκηση ξανά dva_dev.
Η ρουτίνα που έδωσα αφορά μόνο το τρίτο σκέλος της άσκησης.

petalouditsa2007 είσαι ψιλοάσχετη/ος έτσι ? :roll:
Δεν το λέω για να σε προσβάλλω.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

να υλοποιεί την διαίρεση δύο αριθμών των 8 bit

Δημοσίευση από dva_dev » 19 Νοέμ 2007 20:46

Από το ύφος και τη σειρά των ερωτήσεων συμπέρανα ότι θα πρέπει να φτιάξει μια ρουτίνα που να κάνει την διαίρεση (πηλίκο/υπόλοιπο) χωρίς να χρησιμοποιεί το div, και μετά να χρησιμοποιήσει αυτή τη ρουτίνα για να κάνει υπολογισμό του αν κάποιος αριθμός είναι πρώτος. Σε οδηγεί η σειρά των ερωτήσεων στο πως θέλει να είναι η απάντηση. Διαφορετικά δεν θα είχε νόημα να ζητηθεί το πρώτο σκέλος της ερώτησης και θα μπορούσε να ζητηθεί μόνο το τελευταίο.

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

να υλοποιεί την διαίρεση δύο αριθμών των 8 bit

Δημοσίευση από LightForce » 19 Νοέμ 2007 21:51

Νομίζω ότι έχεις δίκιο dva_dev, και το 'διάβασε την άσκηση ξανά' κανονικά θα πρέπει να το πώ στον εαυτό μου.
Κατάλαβα λάθος αφού και η petalouditsa2007 άλλαξε και τον τίτλο, είμαι σίγουρος.
Sorry παιδιά.

Anyway, φυσικά είναι άκυρος ο κώδικας.
Τελευταία επεξεργασία από το μέλος LightForce την 19 Νοέμ 2007 23:48, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

να υλοποιεί την διαίρεση δύο αριθμών των 8 bit

Δημοσίευση από dva_dev » 19 Νοέμ 2007 22:50

Μια απλή λύση που θα μπορούσε να χρησιμοποιηθεί για το Α/Β, προκύπτει από τον ορισμό της διαίρεσης (νομίζω - κάποιος που θυμάται καλύτερα ας με διορθώσει). Να γίνουν αφαιρέσεις του Β από τον Α μέχρις ότου (Α-Β) < Β μέσα σε ένα loop και με κάθε επανάληψη να αυξάνει ένα μετρητή (πηλίκο). Οτι περισσέψει είναι το υπόλοιπο.

Δεν είναι η πιο γρήγορη λύση αλλά μάλλον είναι η πιο απλή.

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

να υλοποιεί την διαίρεση δύο αριθμών των 8 bit

Δημοσίευση από LightForce » 20 Νοέμ 2007 00:07

όπως στο δημοτικό.. :P

Να μια μικρή βοήθεια petalouditsa2007, διαίρεση με αφαίρεση 2 αριθμών των 16 bit.

Είσοδος πριν καλέσεις την ρουτίνα o διαιρετέος στον ax και ο διαιρέτης στον bx
Εξοδος στον dx το πηλίκο και στον ax το υπόλοιπο

Κώδικας: Επιλογή όλων

division&#58;
    xor dx,dx         
lp&#58;
    inc dx              
    sub ax,bx           
    cmp ax,bx        
    jae lp                 
    ret

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

να υλοποιεί την διαίρεση δύο αριθμών των 8 bit

Δημοσίευση από dva_dev » 20 Νοέμ 2007 01:11

Και δύο πιο προχωρημένα links που θα σε βοηθήσουν για μια πιο advanced και γρήγορη λύση
http://pdos.csail.mit.edu/6.828/2007/re ... s03_04.htm
http://www.thescripts.com/forum/post1877925-11.html

Άβαταρ μέλους
Rallia
Δημοσιεύσεις: 24
Εγγραφή: 06 Νοέμ 2007 12:36
Τοποθεσία: Σερρες
Επικοινωνία:

να υλοποιεί την διαίρεση δύο αριθμών των 8 bit

Δημοσίευση από Rallia » 20 Νοέμ 2007 17:20

Για να βοηθήσω και εγώ λίγο στο θέμα...
Καλά το πάτε.. Έτσι ακριβώς πρέπει να γίνει...
Για αυτό το λόγο είπα και ότι η λύση είναι πολύ απλή...
Ένα loop με μια απλή αφαίρεση είναι.

Όσο για το που μπένει η υπορουτίνα, αν και δεν απάντησες στην ερώτηση μου, προφανώς είσαι στη ίδια σχολή με μένα. Αυτό σημαίνει ότι για να το κάνεις το πρόγραμμα σπίτι σου χρησιμοποιείς τον emulator 8086.
Αυτό που έχεις να κάνεις για την υπορουτήνα είναι απλά μετά από το κύριο πρόγραμμά σου να δώσεις ένα όνομα και τις εντολές.
π.χ.:
Afairesh: mov ax,bx
cmp ax,[200h]
.
.

Είναι όπως στον δομημένο προγραμματισμό με τις συνασρτήσεις, τις γράφεις μετά το κυρίως πρόγραμμα αλλά όχι σε ξεχωριστό αρχείο.

Το να σου δώσω την απάντηση δεν έχει κανένα νόημα. Πρέπει να κάτσεις να καταλάβεις τι γίνεται με το μάθημα, γτ και τέλεια εργασία να παρουσιάσεις άμα δεν γράψεις στις τελικές εξετάσεις δεν πρόκειται να περάσεις το μάθημα. Το ξέρω ότι το τελευταίο που θέλεις είναι κάποιον να σου λέει τι θα κάνεις, αλλά είναι και κάποια θέματα αρχής.

Δεν μπορεί κάποιοι να παιδεύονται ώρες μπροστά σε έναν υπολογιστή για να βγάλουν άκρη με το τι γίνεται στο μάθημα, και άλλοι να πέρνουν έτοιμες τις λύσεις, χωρίς να παιδευτούν.

Κατά την γνώμη μου, δεν χρειάζεται να ψάξεις σε καμιά σελίδα στο internet. Αν ανοίξεις το βιβλίο και διαβάσεις ειδικά τα πρώτα μαθήματα είναι απλό. Λίγη καλή θέληση χρειάζεται και τίποτα άλλο.

Έλπίζω να βοήθησα με την υπορουτίνα και το τρόπο σκέψης για την λύση του προβλήματος. Αν χρειαστείς βοήθεια, μπορώ να βοηθήσω. Αλλά το να σου δώσω ξεκάθαρα την λυση, δεν πρόκειται.
Εικόνα

LightForce
WebDev Moderator
Δημοσιεύσεις: 3812
Εγγραφή: 13 Απρ 2003 23:49

να υλοποιεί την διαίρεση δύο αριθμών των 8 bit

Δημοσίευση από LightForce » 20 Νοέμ 2007 23:13

Rallia συμφωνώ μαζί σου.
Νομίζω ότι τα περισσότερα παιδιά έτσι λειτουργούν και έτσι θα πρέπει να λειτουργούν μέσα στο forum.
Σε παρόμοια θέματα όπως την λύση μιας άσκησης προγραμματισμού, προτιμώ και εγώ μια συζήτηση, ιδέες,
ανταλλαγή γνώσεων, αλλά και some code, και ίσως κάτι να βγεί, (ίσως και όχι), παρά την λύση ξερά.
Βέβαια δεν τίθεται θέμα αν κάποιος έχει την όρεξη και το χρόνο να ασχοληθεί πολύ, η ακόμα και την λύση έτοιμη.

petalouditsa2007 ο παρακάτω κώδικας είναι για τον Fasm Αssembler, τρέχει εκεί.
Ελέγχει αν ένας αριθμός των 16 bit είναι prime, με υπορουτίνες και χωρίς div και idiv,
κάνοντας αφαίρεση αντί διαίρεσης χρησιμοποιώντας τις 2 ρουτίνες που έκανα ήδη post με αλλαγές.
Αν είναι πρώτος αριθμός τον τυπώνει σε δεκαδικό (ρουτίνα με div), αν όχι δεν τυπώνει τίποτα.
Είναι γραμμένος στο πόδι, τίποτα ιδιαίτερο, απλά δουλεύει, τσεκαρισμένο απο εδώ


Κώδικας: Επιλογή όλων

	org 100h
		 
	mov bx,2207           ; αριθμός 2207 για έλεγχο 
	call isprime             
	int 20h               ; τέλος


		
; είσοδος&#58; bx = αριθμός για έλεγχο άν είναι πρώτος
; έξοδος&#58; bx = 0 αν δεν είναι πρώτος, bx μένει όπως είναι αν είναι πρώτος	

isprime&#58;
	mov cx,2
.do&#58;   
	mov ax,bx
	cmp cx,ax         
	je .yes 
	call division          
	cmp ax,0
	je .no
	inc cx
	jmp .do         
.yes&#58;
	call numout       ; είναι πρώτος βρίσκεται στον ax, γράψε τον αριθμό σε δεκαδικό
	ret
.no&#58;                            
	xor bx,bx     
	ret
	


; είσοδος&#58; ax = διαιρετέος, cx = διαιρέτης
; έξοδος&#58; dx = πηλίκο, ax = υπόλοιπο		
     
division&#58;
	xor dx,dx       
.lp&#58;
	inc dx             
	sub ax,cx           
	cmp ax,cx       
	jae .lp
	ret 
	  	


; γράψε τον ax σε δεκαδικό	

numout&#58;
	mov cx,10            
dn&#58;
	xor dx,dx
	div cx
	push dx
	or ax,ax
	jz .print
	call dn
.print&#58;
	pop dx
	add dl,30h
	mov ah,02h
	int 21h
	ret        

Απάντηση

Επιστροφή στο “Assembly”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες