Ένα κομμάτι της συναρμολόγησης

29 Αυγ του 2009 από Prashant
Filed under: Τεχνολογία

Αφού διαβάσετε αυτό το άρθρο για το κλείδωμα χωρίς εφεδρείες και βλέποντας τη χρήση του CAS (σύγκριση και ανταλλαγή), ένιωσα σαν απόσπαση τον κωδικό της Συνέλευσης να πράξει το ίδιο. Χρησιμοποιήστε περίπτωση πάνω ήταν εκεί για να γράψει μια εγγενή μέθοδο και να το ονομάσουμε από την Ιάβα (πίσω στο 1,5, όταν ταυτόχρονη δομές δεδομένων σε Java ήταν περισσότερο ή λιγότερο ανύπαρκτη). Χωρίς άλλη καθυστέρηση, θα απελευθερώσει τον κωδικό σας επάνω :) . Πρώτη είναι για το CAS και το δεύτερο είναι για την πληροφορική GCD χρησιμοποιώντας τον αλγόριθμο του Ευκλείδη (αυτό μπορεί να βρεθεί σε πολλά μέρη και σεμινάρια, όπως επίσης).

Μεταγλωττίστε και εκτελέστε τις οδηγίες gcc file_name.c ; ./a.out

Συγκρίνετε και Εναλλαγ

   # Include 
  # Include 
 / / Ανταλλαγή - newvalue, comperand είναι παλιά / αναμενόμενη τιμή
 / *
  * Λειτουργία κάνει πραγματικότητα τα εξής πράγμα - αν η τιμή στο dest * είναι ίση με OldValue στη συνέχεια να την αντικαταστήσει με άλλο newvalue αφήσει αμετάβλητη: όλα αυτά δεν atomically
  *
  * Υπάρχουν δύο επιλογές για την τιμή επιστροφής
  * 1.is αρχική αξία του dest * και αφήστε το βάρος της καλώντας fxn να το συγκρίνουμε με oldval
  * 2.  το κάνουμε εδώ και επιστρέφει 0 ή 1, αυτό θα πρέπει να είναι πιο αποτελεσματική
  ** /

 / * Το αλλάξετε αργότερα σε μακρο * /
 int CAS (int * DEST, int OldValue, int newvalue) {
	 printf ("(% d,% d,% d)", * DEST, OldValue, newvalue)?
	 / * Int CAS (DEST int, int OldValue, int newvalue) {* /
	 / * Int CAS (DEST int, int newvalue, int OldValue) {* /
	 int αποτέλεσμα = 1 ;/ * 1 δείχνει ότι CAS πέτυχε και 0 δείχνει ότι απέτυχε * /
	 / * Btw πρέπει να cc για clobbering σημαία!  * /
	 __asm__ volatile__ __ (
			 "Movl% 2,%% EAX \ n \ t"
			 "Movl% 3,%% ebx \ n \ t"
			 "Movl 0%,%% ecx \ n \ t"
			 "LOCK \ n \ t"
			 "Cmpxchg% ebx%, (%% ecx) \ n \ t" / * πρέπει να κλειδώσετε είναι στην ίδια γραμμή * /
			 "JZ ΕΓΙΝΕ \ n \ t"
			 "Movl $ 0,% 1 \ n \ t"
			 "ΕΓΙΝΕ: \ n \ t"
			 : "= M" (ύδωρ), "= g" (αποτέλεσμα)
			 : "Ζ" (OldValue), "G" (newvalue), "M" (ύδωρ)
			 : "EAX%", "ebx%", "ECx", το "cc"
			 )?
	 printf ("(% d,% d,% d)", * DEST, OldValue, newvalue)?
	 επιστρέψει αποτέλεσμα?
 }

 / * TODO
  * Γράψω άλλη ASM fxn που βάζει πάνω από fxn σε έναν βρόχο, ενώ συνεχίζουμε να προσπαθούμε και αν δεν πετύχει * /

 int main () {
	 int a = 5, β = 6?
	 int * c = (int *) malloc (sizeof (int))?
	 * Γ = 6?
	 / * Int c = 6? * /
	 printf ("% d \ n", CAS (γ, β, β))?
	 printf ("% d \ n", CAS (γ, β, α))?
	 printf ("% d \ n", CAS (γ, α, α))?
	 printf ("% d \ n", CAS (γ, β, β))?
	 * Γ = 6?
	 / * Γ = 5? * /
	 printf ("αλλάζοντας την τιμή του γ * σε% d \ n", * γ)?
	 printf ("% d \ n", CAS (γ, β, β))?
	 printf ("% d \ n", CAS (γ, β, α))?
	 printf ("% d \ n", CAS (γ, α, α))?
	 printf ("% d \ n", CAS (γ, α, β))?
	 printf ("% d \ n", CAS (γ, β, α))?
	 return 0?
 }

Σημειώνει Μορφοποίηση - μοιάζει επισήμανσης σύνταξη WP είναι η προσθήκη στο τέλος, ότι αγνοούν.

GCD

 # Include 
 int gcd (int a, int b) {
     int αποτέλεσμα?
     / * Υπολογισμός Μέγιστος κοινός διαιρέτης χρησιμοποιώντας τον αλγόριθμο του Ευκλείδη * /
     __asm__ volatile__ __ («movl% 1,%% EAX?"
                           "Movl% 2,%% ebx?"
                           "Contd: cmpl $ 0,%% ebx?"
                           "Je ΕΓΙΝΕ?"
                           «EDX xorl%%,%% EDX?"
                           "Idivl% ebx%?"
                           "Movl ebx%%,%% EAX?"
                           «EDX movl%%,%% ebx?"
                           "JMP contd?"
                           "ΕΓΙΝΕ: movl% EAX%, 0%?": "= G" (αποτέλεσμα): "ζ" (α), "G" (β)
     )?

     επιστρέψει αποτέλεσμα?
 }

 int main () {
     int με πρώτο, δεύτερο?
     printf ("Εισάγετε δύο ακεραίων:")?
     scanf ("% d% d", & πρώτα, και το δεύτερο)?

     printf ("ΠΔΠ των% d & d% είναι% d \ n", πρώτο, δεύτερο, gcd (πρώτη, δεύτερη))?

     return 0?
 }

Σχόλια

    blog παρατηρήσεις που κινούνται με Disqus