وهناك القليل من التجمع
بعد قراءة هذه المقالة حول تأمين مخازن حرة ورؤية استخدام CAS (قارن والمبادلة) ، شعرت وكأني بنشر رمز التجميع في أن تحذو حذوها. استخدام أكثر من حالة كان هناك طريقة لكتابة الأصلي والذي يطلق عليه من جاوة (1.5 في الظهر ، عندما المتزامنة هياكل البيانات في جاوة كانوا أكثر أو أقل غير موجودة). دون مزيد من اللغط ، وأنا على إطلاق العنان للرمز لك
. الأول هو لCAS والثاني هو لGCD الحوسبة باستخدام خوارزمية إقليدس (يمكن العثور على هذا واحد في أماكن عديدة والدروس أيضا).
ترجمة وتشغيل تعليمات gcc file_name.c ; ./a.out
قارن وعلوي
وتشمل #وتشمل # / / تبادل -- newvalue ، comperand قديمة / القيمة المتوقعة / * * الفعل في الواقع لا شيء التالية -- إذا كانت القيمة في دست * تساوي oldvalue ثم الاستعاضة عنها newvalue تركها دون تغيير آخر : هل كل هذه بالذرة * * وهناك خياران لقيمة الإرجاع * 1.is القيمة الأولية دست * وترك عبء الدعوة fxn مقارنتها مع oldval * 2. يفعل ذلك أكثر من هنا والعودة 0 أو 1 ، وهذا ينبغي أن تكون أكثر كفاءة * * / / * في وقت لاحق الى تغييره الماكرو * / الباحث CAS (الباحث * دست ، وكثافة العمليات oldvalue ، وكثافة العمليات newvalue) { printf ("(٪ د ٪ د ٪ د)" * ، دست ، oldvalue ، newvalue) ؛ / * الباحث CAS (الباحث دست ، وكثافة العمليات oldvalue ، وكثافة العمليات newvalue) {/ * / * الباحث CAS (الباحث دست ، وكثافة العمليات newvalue ، وكثافة العمليات oldvalue) {/ * الباحث نتيجة = 1 ؛ / * 1 يبين أن الاكاديمية نجحت ويظهر أنه فشل 0 * / / * BTW تحتاج إلى تعيين مكعب لclobbering العلم! * / __volatile__ __asm__ ( "movl 2 ٪ ٪ ٪ EAX \ ن \ ر" "movl ٪ 3 ، ٪ EBX \ ن \ ر" "0 ٪ movl ، ECX ٪ \ ن \ ر" "LOCK \ ن \ ر" "CMPXCHG EBX ٪ ٪ ، (٪ ECX ٪) \ ن \ ر" يجب أن / * LOCK تكون على نفس السطر * / "حررت JZ \ ن \ ر" "movl $ 0 ، 1 ٪ \ ن \ ر" "حررت : \ ن \ ر" : "= م" (دست) ، "ز =" (النتيجة) : "ز" (oldvalue) ، "ز" (newvalue) ، "م" (دست) : "EAX ٪" ، "EBX ٪" ، "ECX" ، "سي سي" ؛) printf ("(٪ د ٪ د ٪ د)" * ، دست ، oldvalue ، newvalue) ؛ عودة نتيجة ؛ } / * TODO * الكتابة آخر fxn ASM الذي يضع فوق fxn في حلقة وبينما تحاول أن تبقي ما لم ينجح * / الباحث الرئيسي () { الباحث أ = 5 ، ب = 6 ؛ * الباحث ج = (الباحث *) malloc (sizeof (الباحث)) ؛ * ج = 6 ؛ / * الباحث ج = 6 ؛ * / printf ("٪ د \ ن" ، CAS (ج ، ب ، ب)) ؛ printf ("٪ د \ ن" ، CAS (ج ، ب ، أ)) ؛ printf ("٪ د \ ن" ، CAS (ج ، أ ، أ)) ؛ printf ("٪ د \ ن" ، CAS (ج ، ب ، ب)) ؛ * ج = 6 ؛ / * ج = 5 ؛ * / printf ("تغيير قيمة * ج ب ٪ د \ ن" ، * ج) ؛ printf ("٪ د \ ن" ، CAS (ج ، ب ، ب)) ؛ printf ("٪ د \ ن" ، CAS (ج ، ب ، أ)) ؛ printf ("٪ د \ ن" ، CAS (ج ، أ ، أ)) ؛ printf ("٪ د \ ن" ، CAS (ج ، أ ، ب)) ؛ printf ("٪ د \ ن" ، CAS (ج ، ب ، أ)) ؛ عودة 0 ؛ }
تلاحظ التنسيق -- يبدو وكأنه تمييز بناء الجملة الفسفور الابيض هو إضافة في النهاية ، وتجاهل ذلك.
GCD
وتشمل #الباحث GCD (الباحث أ ، الباحث ب) { نتيجة كثافة العمليات ؛ / * حساب المقسوم المشترك الأكبر باستخدام خوارزمية إقليدس * / __asm__ __volatile__ ("movl ٪ 1 ، ٪ EAX ٪ ؛" "movl ٪ 2 ٪ EBX ٪ ؛" "تابع : $ cmpl 0 ٪ ، EBX" ؛ "حررت جي" ؛ "٪ xorl EDX ٪ EDX ٪ ؛" "٪ idivl EBX" ؛ "٪ movl EBX ، EAX ٪ ٪ ؛" "٪ movl EDX ، EBX ٪ ٪ ؛" "تابع أحزاب اللقاء المشترك" ؛ "حررت : EAX movl ٪ ٪ ٪ 0 ؛" : "= ز" (النتيجة) : "ز" (أ) ، "ز" (ب) ؛) عودة نتيجة ؛ } الباحث الرئيسي () { الباحث الأول والثاني ؛ printf ("أدخل عددين :") ؛ scanf ("٪ ٪ د د" ، والأولى والثانية) ؛ printf ("GCD من د ٪ و ٪ d هو ٪ د \ ن" ، الأولى والثانية ، GCD (الأولى والثانية)) ؛ عودة 0 ؛ }



































