x86 التجمع حدوث شخصية

  • المقدمة
  • القضية
  • حل
  • تفسير

المقدمة

تمرين التجميع الصغير أدناه مخصص لبنية x86 (Intel و AMD 32 بت) x ويستخدم صيغة NASM ، مجمّع ، متاح مجانًا و

التي يمكن استخدامها على منصات مختلفة مثل ويندوز أو لينكس.

لاحظ أن الوظائف الخارجية المستخدمة تأتي من مكتبة C القياسية.

القضية

تخيل مجموعة من الأحرف (التي لا تنتهي بالضرورة بـ 0). لها حجم ونود اختبار وجود شخصية معينة

في هذه المجموعة. سيكون الهدف هو كتابة وظيفة تأخذ كمدخلات مجموعة من الأحرف والحجم والشخصية. إذا كانت هذه الشخصية موجودة في

الصفيف ، تقوم بإرجاع قيمة غير صفرية ، وإلا فإنها ترجع صفر.

هنا ما تعطي هذه الوظيفة في C:

 / الدالة int is_in_array (char * array، int size، char c)؛ // implementation: char tab [] = {'n'، 'e'، 'u'، 'e'}؛ is_in_array (علامة تبويب ، sizeof (علامة تبويب) ، 'u') ؛ / / إرجاع قيمة أخرى غير 0 is_in_array (علامة التبويب ، sizeof (علامة التبويب) ، 'a') ؛ // Return value 0 ببساطة أدخل الكود في: extern printf section .data array db 'dadedidadedavivoufufifamasibifisaz' yes db 'oui'، 10، 0 no db 'non'، 10، 0 section .text global main is_in_array:؛ insert the code هناك الرئيسية: دفع ebp mov ebp ، esp ؛ اختبار إذا كان m في الصفيف dword 'm' ؛ طول الصفيف (هنا 34) دفع dword 34 ؛ عنوان السلسلة في صفيف دفع eax ؛ استدعاء is_in_array مع عنوان صفيف ؛ الحجم والقيمة التي تبحث عنها call is_in_array test eax ، eax jnz is_there ؛ إذا كان eax! = 0 عرض نعم ، اضغط على لا ؛ ثم قم بعرض أي jmp screendisplay ؛ عرض تصويري للخيط مع printf is_there ترك المتقاعد 

بالتأكيد لن يكون هذا كافيًا .....

حل

 is_in_array: ؛ يسترجع عنوان المصفوفة (المعلمة الأولى) في edi mov edi ، [esp + 4] ؛ يسترجع حجم المصفوفة (المعلمة الثانية) في ecx mov ecx ، [esp + 8] ؛ يسترجع الحرف لإيجاد (المعلمة الثالثة) في eax mov eax ، [esp + 12] ؛ ابحث عن حرف repne scasb ؛ إذا كان للعلم ZERO (ZF) قيمة 1 ، فهذا يعني أنه تم العثور على الحرف ؛ وفي الحالة الأخرى لم يتم العثور عليه ؛ ببساطة أضف قيمة ZF في eax mov eax ، 0 ؛ إذا كانت ZF = 1 ، فإن al = 1 (al كونها 8 بتات ذات أهمية أقل من eax) setz al ret 

تفسير

 ZF = 0 ecx = طول eax = حرف edi = صفيف // الحلقة التي تعرف "repne scasb" بينما ecx! = 0 ET ZF = 0 افعل إذا al == [edi] ثم ZF = 1 FinSi ecx = ecx - 1 edi = edi + 1 EndWhile eax = 0 // الشرط الذي يعرف "setz" Si ZF = 1 Alors eax = 1 EndIf 
المقال السابق المقالة القادمة

نصائح الأعلى