1. أدوات الضرب
1.1 أداة الضرب للأعداد الموجبة : MUL (تذكرها جيدا)
تقوم الأداة mul بضرب عدد موجب في الخزان المسمى : الحاشد (AL أو AX أو EAX).
نسمي في هذه الحالة :
العدد الموجب بـــــــــــالضارب.
الحاشد بـــــــــــــالمضروب فيه.
ولدينا 3 حالات :
-
إذا كان حجم أحدهما هو ثمن واحد فإن المضروب فيه هو AL والنتيجة تكون في AX .
-
إذا كان حجم أحدهما هو ثمنين يعني ربع فإن المضروب فيه هو AX والنتيجة تكون في الخزانين DX:AX .
-
إذا كان حجم أحدهما هو 4 أثمان أي نصف فإن المضروب فيه هو EAX والنتيجة تكون في EDX:EAX .
أمثلة:
مثال للحالة 1 | مثال للحالة 2 | مثال للحالة 3 |
mov al, 9 mov bl, 8 mul bl ;ax=72 |
mov ax, 9 mov bl, 3 mul bl ; dx=0 و ax=27 |
mov eax, 9FFFFFFFh |
1.2 أداة الضرب للأعداد السالبة : IMUL
تقوم الأداة imul بضرب عدد في الخزان المسمى : الحاشد (AL أو AX أو EAX).
نسمي في هذه الحالة :
العدد بـــــــــــالضارب.
الحاشد بـــــــــــــالمضروب فيه.
ولدينا 3 حالات :
-
إذا كان حجم أحدهما هو ثمن واحد فإن المضروب فيه هو AL والنتيجة تكون في AX .
-
إذا كان حجم أحدهما هو ثمنين يعني ربع فإن المضروب فيه هو AX والنتيجة تكون في الخزانين DX:AX .
-
إذا كان حجم أحدهما هو 4 أثمان أي نصف فإن المضروب فيه هو EAX والنتيجة تكون في EDX:EAX .
أمثلة:
مثال للحالة 1 | مثال للحالة 2 | مثال للحالة 3 |
mov al, -9 mov bl, 8 mul bl ;ax=B8h |
mov ax, -9 mov bl, 3 mul bl ; dx=FFh و ax=E5h |
mov eax, 9FFFFFFFh |
2. أدوات القسمة
2.1 أداة القسمة للأعداد الموجبة : DIV (تذكرها جيدا جيدا)
تقوم الأداة div بقسمة الخزان المسمى : الحاشد (AL أو AX أو EAX) على عدد موجب.
نسمي في هذه الحالة :
العدد الموجب بـــــــــــالقاسم.
الحاشد بـــــــــــــالمقسوم عليه.
ولدينا 3 حالات :
-
إذا كان حجم القاسم هو ثمن واحد فإن المقسوم عليه هو AX والنتيجة: الخارج في AL والباقي في AH .
-
إذا كان حجم القاسم هو ثمنين يعني ربع فإن المقسوم عليه هو DX:AX والنتيجة: الخارج في AX والباقي في DX
-
إذا كان حجم القاسم هو 4 أثمان أي نصف فإن المقسوم عليه هو EDX:EAX والنتيجة: الخارج في EAX والباقي في EDX
أمثلة:
مثال للحالة 1 | مثال للحالة 2 | مثال للحالة 3 |
mov ax, 16; المقسوم عليه mov bl, 4 ; القاسم div bl ;ah=0 و al=4 |
xor dx,dx ;dx=0 mov ax, 19 ; المقسوم عليه mov ax, 6 ; القاسم div bl ; dx=1 و ax=3 |
xor dx, dx mov eax, 0x9564 ; EAX = 38244 المقسوم عليه mov bx, 0x64 ; BX = 100 القاسم div bx ; DX = 0x002C (44), AX = 0x017E (382) |
2.2 أداة القسمة للأعداد السالبة : IDIV
تقوم الأداة idiv بقسمة الخزان المسمى : الحاشد (AL أو AX أو EAX) على عدد.
نسمي في هذه الحالة :
العدد بـــــــــــالقاسم.
الحاشد بــــــــــالمقسوم عليه.
ولدينا 3 حالات :
-
إذا كان حجم القاسم هو ثمن واحد فإن المقسوم عليه هو AX والنتيجة: الخارج في AL والباقي في AH .
-
إذا كان حجم القاسم هو ثمنين يعني ربع فإن المقسوم عليه هو DX:AX والنتيجة: الخارج في AX والباقي في DX
-
إذا كان حجم القاسم هو 4 أثمان أي نصف فإن المقسوم عليه هو EDX:EAX والنتيجة: الخارج في EAX والباقي في EDX
أمثلة:
(ملاحظة : لتمثيل الأعداد في النظام الستعشري نضع h في آخر العدد أو 0x في أوله وربما نجد أيضا الرمز $ في أوله)
مثال للحالة 1 | مثال للحالة 2 | مثال للحالة 3 |
mov ax, 16; المقسوم عليه mov bl, -4 ; القاسم idiv bl ;ah=Fh و al=Ch |
xor dx,dx ;dx=0 mov ax, 18 ; المقسوم عليه mov ax, -6 ; القاسم idiv bl ; dx=0xFF و ax=FD |
mov dx, 0xFFFF mov ax, 0x9564 ; DX:AX = -27292 mov bx, 0x3E8 ; BX = 100 idiv bx ; DX=0xFFA4 (-92), AX=0xFEF0 (-272) |
ملاحظة : يجب مراجعة هندسة الحاسوب لتسهيل الفهم.
3. أدوات الإزاحة
3.1 الإزاحة من اليمين إلى اليسار: SAL و SHL
SAL للإزاحة الحسابية نحو اليسار.
SHL للإزاحة المنطقية نحو اليسار.
لهما نفس المبدأ أو العمل حيث تقوم sal أو shl بإزاحة الأزواج نحو اليسار:
ففي كل إزاحة يخرج زوج من اليسار ويوضع في العلم CF حيث يرافقه دخول 0 من اليمين.
مثال: نعتبر AL = 00110110b أي 54 بالنظام العشري. ونريد أن نزيح أزواجه نحو اليسار مرة واحدة.
إذن يكون لدينا : sal al,1
وبالتالي تصبح al = 01101100b أي 108
نلاحظ أن al كأنه ضُرب في 2، ألست توافقنا في هذا؟
أمثلة أخرى:
mov ax,3 |
3.2 الإزاحة من اليسار إلى اليمين : SAR و SHR
SAR للإزاحة الحسابية نحو اليمين.
SHR للإزاحة المنطقية نحو اليمين.
لهما نفس المبدأ أو العمل حيث تقوم sar أو shr بإزاحة الأزواج نحو اليمين إلا أن هناك فرق:
- shr : في كل إزاحة يخرج زوج من اليمين ويوضع في العلم CF حيث يرافقه دخول 0 من اليسار.
- sar : في كل إزاحة يخرج زوج من اليمين ويوضع في العلم CF حيث يرافقه دخول 0 من اليسار إذا كان العدد موجبا أو دخول 1 إذا كان العدد سالبا.
مثال: نعتبر AL = 10110111b أي 72- بالنظام العشري. ونريد أن نزيح أزواجه نحو اليمين مرة واحدة.
الحالة 1: لدينا : sar al,1
وبالتالي تصبح al = 11011011b أي 36-
نلاحظ أن al كأنه قسم على 2، أليس كذلك؟
الحالة 2: لدينا : shr al,1
وبالتالي تصبح al = 01011011b أي 91
نلاحظ أن sar قد تستعمل في تسهيل عملية القسمة عوض shr، هل لاحظت ذلك؟
أمثلة أخرى:
mov ax, 0x1234 |
4. الضرب والإزاحة
في الحقيقة إن عملية الضرب باستعمال mul أو imul أثقل من ناحية السرعة من استعمال الإزاحة والجمع أو الطرح.
4.1 الضرب في قوى 2
كما رأينا أن كل إزاحة نحو اليسار مرة واحدة تكافئ عملية الضرب في 2 .
وكذلك كل إزاحة نحو اليسار مرتين تكافئ عملية الضرب في 4 .
وكذلك كل إزاحة نحو اليسار 3 مرات تكافئ عملية الضرب في 8 .
وهكذا...
عموما : كل إزاحة نحو اليسار n مرة تكافئ عملية الضرب في 2n .
خلاصة : عوض استعمال الضرب في قوى 2 (أي 2 و 4 و 8 و 16 و32 و64 و ...) باستعمال mul أو imul من المستحسن استعمال الإزاحة نحو اليسار أي استعمال إحدى الأداتين shl أو sal.
4.2 الضرب في عدد ليس من قوى 2
مثال 1:
لنأخذ مثالا شائعا : وهو حساب عنوان أو مكان النقيطة (pixel) في الشاشة.
نفترض أن العدد القصوي للأراتيب هو 199 (لدينا 200 أرتوب).
ونفترض أن العدد القصوي للأفاصيل هو 319 (لدينا 320 أفصول).
319......................0 | |
.
|
0 : : : : : : 199 |
لتحديد مكان نقيطة على الشاشة نستعمل العلاقة التالية : X+320Y (حيث X يمثل الأفاصيل و Y يمثل الأراتيب).
أولا: نلاحظ أن 320 ليس من قوى 2 ، لكن يمكن تفكيكه باستعمال قوى 2. ===>
320 = 256 + 64 أو 320 = (4+1).64
إذن تصبح العلاقة على الشكلين التالين:
-
X+256Y+64Y الشكل الأول :
-
X+64(4Y+Y)الشكل الثاني :
إذن لينا إزاحتين لأن 320 ليس من قوى 2. ومن المستحسن استعمال الشكل الثاني، ويمكن تطبيقه :
في المجمع
mov ax,Y ; ax=Y |
في C
offset=(((Y<<2)+Y)<<6)+X; |
في Pascal
Offset:=(((Y Shl 2) + Y) Shl 2) +X; |
مثال 2:
لنأخذ المثال التالي : نريد أن نضرب العدد N في 15.
معلوم أن 15 ليس من قوى 2 ، وبالتالي يمكن تفكيكه باستعمال قوى 2.
ونكتب إذن :
8N+4N+2N+N : هنا لدينا 3 إزاحات و3 عمليات جمع، لكن بالإمكان أن نكتب:
16N-N : هنا لدينا إزاحة واحدة وعملية طرح واحدة : إذن هذه الأخيرة هي الأفضل والأسرع.
ملاحظة : إن عملية الجمع بالنسبة لعقل الحاسوب لها نفس المدة التي تأخذها عملية الطرح.
مثال 3:
نريد أن نضرب العدد N في 226 .
معلوم أن 226 ليس من قوى 2 ، وبالتالي يمكن تفكيكه باستعمال قوى 2.
ونكتب إذن :
128N+64N+32N+2N : هنا لدينا 4 إزاحات و3 عمليات جمع، لكن بالإمكان أن نكتب:
256N-16N-8N-4N-2N : هنا لدينا 5 إزاحات و4 عمليات طرح، لكن بالإمكان أن نكتب:
256N-32N+2N : هنا لدينا 3 إزاحات وعملية طرح وجمع : إذن هذه الأخيرة هي الأفضل والأسرع.
خلاصة : إن تسريع مشروعك أو شفرتك أو برنامجك مرتبط بدرجة ذكائك.
5. القسمة والإزاحة
في الحقيقة إن عملية القسمة باستعمال div أو idiv أثـقل من ناحية السرعة من استعمال الإزاحة والعوامل المنطقية.
كما أن القسمة على عدد ليس من قوى 2 لا يكون إلا بإحدى الأداتين div أو idiv . وسنتطرق هنا فقط لتسهيل وتسريع القسمة على قوى 2.
5.1 تحديد باقي القسمة باستعمال قوى 2 والعامل المنطقي and
بكل بساطة لتحديد باقي القسمة على قوى 2 (أي 1 أو 2 أو 4 أو 8 أو ...) نستعمل العلاقة الآتية :
الباقي = (X and (2N-1))
مسألة : حاول البرهنة على هذه العلاقة ؟
مثال : حدد باقي القسمة الصحيحة للعدد 17 على 4 .
الحل :
يدويا لدينا 1 + 4 × 4 = 17 إذن الباقي هو 1 .
وباستعمال العلاقة أعلاه لدينا :
الباقي هو : |
17 and (22-1) = 17 and 3 = 1 |
يمكنك أن تتأكد من صحة ذلك من خلال الآلة الحاسبة الموجودة في نظام التشغيل!
يمكن إذا حساب الباقي في المجمع بـ :
mov ax,X ;ax = X |
5.2 تحديد خارج القسمة على قوى 2
كما رأينا أن كل إزاحة نحو اليمين مرة واحدة تكافئ عملية القسمة على 2 .
وكذلك كل إزاحة نحو اليمين مرتين تكافئ عملية القسمة على 4 .
وكذلك كل إزاحة نحو اليمين 3 مرات تكافئ عملية القسمة على 8 .
وهكذا...
عموما : كل إزاحة نحو اليمين n مرة تكافئ عملية القسمة على 2n .
خلاصة : عوض استعمال القسمة على قوى 2 (أي 2 و 4 و 8 و 16 و32 و64 و ...) باستعمال div أو idiv من المستحسن استعمال الإزاحة نحو اليسار أي استعمال الأداة sar.
ملاحظة : الإزاحة نحو اليمين تعطي فقط خارج القسمة وليس الباقي