Ένα κομμάτι του συνέρχεσθαι
Αφού διαβάσετε αυτό το άρθρο για το κλείδωμα δωρεάν προσκρουστήρες και βλέποντας τη χρήση του CAS (συγκρίνετε και swap), ένιωσα σαν την απόσπαση τον κωδικό συνέλευση για να κάνουν το ίδιο. Χρησιμοποιήστε την περίπτωση πάνω από ήταν εκεί για να γράψει ένα εγγενές μέθοδο και να το ονομάσουμε από Java (πίσω στο 1,5, όταν ταυτόχρονη δομές δεδομένων σε Java ήταν περισσότερο ή λιγότερο δεν υπάρχουν). Χωρίς άλλη καθυστέρηση, θα εξαπολύσουν τον κωδικό επάνω σε σας
. Πρώτα είναι για CAS και το δεύτερο είναι για την πληροφορική GCD χρησιμοποιώντας τον αλγόριθμο του Ευκλείδη (αυτό μπορεί να βρεθεί σε πολλά μέρη και σεμινάρια, όπως επίσης).
Μεταγλωττίστε και εκτελέστε τις οδηγίες gcc file_name.c ; ./a.out
Συγκρίνετε και Swap
# Include# Include / / Ανταλλαγή - newvalue, comperand είναι παλιά / αναμενόμενη τιμή / * * Λειτουργία κάνει στην πράξη τα εξής πράγμα - αν η τιμή στο * dest είναι ίση με OldValue στη συνέχεια να την αντικαταστήσει με άλλο newvalue αφήσει ως έχει: κάνει όλα αυτά τα atomically * * Υπάρχουν δύο επιλογές για την τιμή επιστροφής * 1.is αρχική τιμή του * dest και να αφήσει το βάρος της καλώντας fxn να το συγκρίνουμε με oldval * 2. το κάνετε εδώ και να επιστρέψουν 0 ή 1, αυτό θα πρέπει να είναι πιο αποτελεσματική * * / / * Αργότερα να το αλλάξετε σε μακρο * / int CAS (int * dest, OldValue int, 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! * / __volatile__ __asm__ ( "% Movl 2,%% EAX \ n \ t" "% Movl 3,%% ebx \ n \ t" "Movl 0%,%% ecx \ n \ t" "LOCK \ n \ t" "Cmpxchg% ebx%, (%% ecx) \ n \ t" / * LOCK πρέπει να είναι στην ίδια γραμμή * / "JZ ΕΓΙΝΕ \ n \ t" "Movl $ 0,% 1 \ n \ t" "ΕΓΙΝΕ: \ n \ t" : "= M" (ύδωρ), "= g" (αποτέλεσμα) : "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))? * C = 6? / * Int c = 6? * / printf ("% d \ n", CAS (γ, β, β))? printf ("% d \ n", CAS (γ, β, α))? printf ("% d \ n", CAS (γ, α, α))? printf ("% d \ n", CAS (γ, β, β))? * C = 6? / * C = 5? * / printf ("αλλαγή αξία * c για% d \ n", * γ)? printf ("% d \ n", CAS (γ, β, β))? printf ("% d \ n", CAS (γ, β, α))? printf ("% d \ n", CAS (γ, α, α))? printf ("% d \ n", CAS (c, a, b))? printf ("% d \ n", CAS (γ, β, α))? επιστροφή 0? }
Σημειώνει Μορφοποίηση - μοιάζει highlighter σύνταξη WP είναι η προσθήκη στο τέλος, να αγνοήσει αυτό.
GCD
# Includeint GCD (int a, int b) { int αποτέλεσμα? / * Υπολογισμός μέγιστο κοινό διαιρέτη χρησιμοποιώντας * Αλγόριθμος του Ευκλείδη / __volatile__ __asm__ ("% movl 1,%% EAX?" "% Movl 2,%% ebx?" "Contd: cmpl $ 0, ebx%%?" "Je ΕΓΙΝΕ?" "Xorl% EDX%,%% EDX?" "Idivl% ebx%?" "Movl ebx%%,%% EAX?" "Movl% EDX%,% ebx%?" "JMP contd?" "ΕΓΙΝΕ: movl% EAX%, 0%?": "= G" (αποτέλεσμα): "ζ" (α), "G" (β) )? επιστροφή αποτέλεσμα? } int main () { int πρώτο, το δεύτερο? printf ("Εισάγετε δύο ακεραίων:")? scanf ("% d% d", & πρώτα, και το δεύτερο)? printf ("GCD των% d και% d είναι% d \ n", πρώτο, δεύτερο, gcd (πρώτη, δεύτερη))? επιστροφή 0? }



































