السلام عليكم
الاخت منسيه لايمكن ضرب عددين بطريقة الشفت الى إذا كان احد هذين الرقمين من نوع اوس 2 , مثال على ذالك 2 و 4 و 8 و 16. كلها ارقام يمكن ان تكتب على شكل 2 مرفوعه لعدد صحيح (Integer) والنتيجه دائماً تكون عدد صحيح.
بنفس الطريقه يمكن قسمة عدد على عدد اخر بشرط ان يكون المقسوم عليه عدد من نوع اوس 2.
حاولت فهم ما يقوم به البرنامج لكن عجزت و بالمقابل استطيع ان ااكد انه لا يقوم بضرب عددين .
هناك طريقه للتحايل على البرسسر لجعله القيام بعملية الضرب لبعض الارقام الاخرى التى لا تخضع لنظام اوس 2 مثال على ذالك لو اردنا القيام بالتالى:
5*X يكننا وضع X فى مسجل eax ثم التالى:
mov eax,X mov eax,[eax+eax*4]
طبعاً راح تقولو لى فى عملية ضرب, ولكن الكمبالير سيقوم بعملية optimization لذالك سيترجم علمية الضرب الى شفت مباشراً.
إسمحى لى يا اخت منسيه القيام ببعض التعديلات على الكود حتى يسهل فهمه:
mov ecx,16 mov bx,second;اقصد الرقم الثاني mov dl,count L: shr bx,1 jnc skip movzx eax,First shl eax,dl add answer,eax skip: inc dl loop L
كمى تلاحظين الكود اصبح اقل و إستخدم المسجلات اسرع من إستخدام الذاكره (variable).
والسلام
لا إله إلا الله محمد رسول الله
busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.