الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تمت الإجابة ]Mmx

بدأه in4maTic في 4 مارس 2008 · 4 رد · 1,694 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم...

الأخوة الأعزاء...

الكود التالي يقوم بفحص ما إذا كان المعالج يدعم الـ MMX, أرجو ممن لديه الخبرة إعطاء بعض الشرح حول التعليمات والغاية منها...

function  IsSupportMMX : Boolean;
begin

  try
   asm
	push eax
	push ebx
	push ecx
	push edx
	pushfd
	pop eax
	mov ebx,eax
	xor eax,$00200000
	push eax
	popfd
	pushfd
	pop eax
	xor eax,ebx
	je @NoMMX
	mov eax,$01
	test edx,$800000
	jz @NoMMX
	mov byte ptr[Result],1
	@NoMMX:
	pop edx
	pop ecx
	pop ebx
	pop eax
   end;
  except;
  end;
end;

حيث أن result هو المتحول الذي ستعاد فيه نتيجة التابع...

جزاكم الله خيراً

المال في الغربة وطن والفقر في الوطن غربة

#2

وعليكم السلام ورحمة الله وبركاته,

أعطيك ما هو أفضل وأوضح؟

افضل استخدام CPUID للحصول على الـ flags ومن ثم اقوم بتحديد ان كانت التقنية التي ارغب مدعومة او لا.

الـ flags عبارة عن قيمة بطول 32 بت

post-7008-1204729064_thumb.jpg

ما تريده موجود على البت 23

لذلك ساقوم بفحص ان كان المعالج من عائلة Pentium اولا من خلال فحص اول بت الذي يشير الى تقنية FPU.

ثم ساقوم بالتحقق من قيمة البت 23 من خلال الازاحة الى اليمين بنفس القيمة 23, ان كان 1 فـ MMX مدعومة والا...

قيمة eax = 1 التي تضعها قبل طلب CPUID تعيد لك الـ flags

لو كانت قيمة eax = 0 فالقيمة المعادة هي نص ما يعرف عن المصنع يتم اعادته (على الترتيب من اليسار الى اليمين) في المسجلات ebx, edx, ecx

لدّي سيتم اعادة القيم التالية:

post-7008-1204729308_thumb.jpg

لاحظ القيم بالاسكي, (بالترتيب حسب ترتيب المسجلات المذكور اعلاه) AuthenticAMD

انتل تعيد GenuineIntel حسب معلوماتي, حتى المعالجات القديمة من AMD كانت تعيد AMD ISBETTER :lol:

isMMX	proc
	mov eax, 1
	cpuid
	push edx ; holds CPU features

	and edx, 1 ; check if FPU is supported, FPU resides in first bit
	cmp edx, 0 ; if edx is zero then FPU is not supported
 ; (assume FPU supported then 1st bit is 1, when "AND" with 1 edx -> 1)
 ; (assume FPU isnt supported then 1st bit is 0, when "AND" with 1 edx -> 0)
	je err	 ; not supported, yer out of P-family

	pop edx	 ;
	shr edx, 23 ; shift flags to right by 23, now edx hols MMX bit as first bit
	and edx, 1 ; bitwise with 1
	cmp edx, 0 ; check for MMX
	je err	 ; shame, MMX isn't supported
 ; otherwise...
	mov eax, 1
	ret

err:
	mov eax, 0	
	ret
isMMX endp

بخصوص الوظيفة التي قمت بارفقاها لاحظ ان:

800000$ تساوي 100000000000000000000000b البت 23 هو 1 الذي يشير الى دعم MMX.

$200000 تساوي 1000000000000000000000b البت 21 هو الفعّال.

وفقا لتفصيلات الـ flags والـ eflags:

http://en.wikipedia.org/wiki/FLAGS_register_(computing)

فالبت 21 هو الذي يشير الى ان المعالج من عائلة P+

EFL كقيمة اولية تشير فقط الى flags (موضحة في الرابط اعلاه) -- لذا هي اول 16 بت فقط.

اريد ان اصل الى البت 21 الآن, لذلك ساقوم بضم 200000$ الى هذه القيمة من خلال XOR (نحن نعلم ان الـ high dword تساوي الصفر لذلك لن نقوم بتعطب قيمة اساسية).

الان نعيد القيمة الى EFL -- "بتصوري والله اعلى واعلم لاني لم ادخل في هذه التفاصيل من قبل" لو اننا نعمل على معالج قديم فسيكون البت 21 محجوزاً ومن غير الممكن التعديل في بت محجوز لذا لن يتم وضع القيمة 200246 في EFL وستبقى 246 -- وان قبلت هذه القيمة واصبحت 200246 فنحن نعمل على معالج P+

اتصور عند هذه النقطة الكود ناقص, لاحظ يتم اسناد 1 الى EAX (هل يحاول استخدام cpuid؟) ومن ثم يتم فحص EDX من اجل البت 23 لكن هذا هراء بهذا الشكل.

لذلك لدينا احد امرين والله اعلم, اما ان الكود ينقص استخدام cpuid وهو الغالب.

او ان المبرمج غير متمكن من التعامل مع هذه التفصيلات بالتالي يفترض ان MMX مدعومة طالما المعالج P+ ويضع بعض البهارات البرمجية لكي يجعل اعضاء الفريق العربي للبرمجة يتوهون قليلاً في التحليل. :P

انت تعمل على دلفي صح؟ CTRL+ALT+C وانظر كيف يتم تغيير قيمة المسجلات عند التنفيذ.

معلومات أوسع عن CPUID: http://grafi.ii.pw.edu.pl/gbm/x86/cpuid.html

السلام عليكم

تم تعديل هذه المشاركة بواسطة Xacker في 5 مارس 2008 في 18:54

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3
Xacker كتب:
الان نعيد القيمة الى EFL -- "بتصوري والله اعلى واعلم لاني لم ادخل في هذه التفاصيل من قبل" لو اننا نعمل على معالج قديم فسيكون البت 21 محجوزاً ومن غير الممكن التعديل في بت محجوز لذا لن يتم وضع القيمة 200246 في EFL وستبقى 246 -- وان قبلت هذه القيمة واصبحت 200246 فنحن نعمل على معالج P+

تأكدت من دقة هذا الكلام من خلال رابط ضمن الرابط اعلاه:

http://grafi.ii.pw.edu.pl/gbm/x86/base486.html

اقتباس
Checking for CPUID support

This is quite easy. Try to change the value of CPUID bit (bit 21) in EFLAGS. If the bit can be toggled, CPUID is supported and shall be used for precise identification. On Cyrix chips the bit cannot be toggled if not explicitly allowed

تمت الاجابة؟ :happy:

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

نظرة مبرمجي دلفي تختلف عن مبرمجي لغة التجميع :lol:

-

باختصار الكود فوق يستخدم Eflags للتحقق من دعم المعالج لامر CPUID فان كان يدعمها يستخدم EFlags مرة ثانية ليتحقق من انه يدعم MMX

والسلام عليكم ورحمة الله

d4baa0.gif
#5

بسم الله الرحمن الرحيم

الكود في اول مشاركة صحيح فقط يحتاج الى cpuid.

تمت الإجابة على الموضوع

إدارة الفريق العربي للبرمجة

تم تعديل هذه المشاركة بواسطة Xacker في 8 مارس 2008 في 09:59

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

مواضيع مشابهة