وهناك القليل من التجمع

29 أغسطس 2009 بواسطة براشانت · تعليقات
قدم تحت : التكنولوجيا

بعد قراءة هذه المقالة حول تأمين مخازن حرة ورؤية استخدام 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 ؛
 }