شرح مصور عن برنامج Assembler تعليمات التجميع الحسابية

فريق أدك(أضف مع حمل) ينتمي إلى المجموعة أوامر عدد صحيح(أو الثنائية)علم الحساب (تعليمات الحساب الثنائي) وينفذ إضافة عدد صحيح لمعاملين موقعين أو غير موقعين ( DESTو SRC) و حمل العلم EFLAGS.CF . المعامل الأول ( معامل الوجهة, DEST) يمكن أن يكون متغيرًا في السجل أو في الذاكرة ( , ص16، ص32، ص/م8, ص/م16, ص/م32). المعامل الثاني ( المعامل المصدر, SRC) - المعنى المباشر ( imm8, imm16, imm32)، متغير في السجل أو في الذاكرة. في هذه الحالة، لا يمكن أن يكون كلا المعاملين متغيرات في الذاكرة في نفس الوقت.

نتيجة الإضافة بالأمر أدكيتم وضعه بدلاً من المعامل الأول ( DEST). يتم تعيين العلامات الموجودة في سجل EFLAGS وفقًا للنتيجة.

عند إضافة قيمة مباشرة imm8أو imm16مع معامل ثنائي البايت أو أربعة بايت، يتم أولاً توسيع القيمة المباشرة إلى حجم المعامل الأول، وعندها فقط يتم إجراء الإضافة.

فريق أدكتستخدم عادة في multibyte أو multiword ( عدة كلمات) عمليات الإضافة. في هذه الحالة، فإنه يتبع تعليمة ADD، التي تُرجع مجموع البتات ذات الترتيب المنخفض للمعاملات متعددة البايت (متعددة الكلمات)، مما يسمح بأخذ الترحيل في الاعتبار عند إضافة البتات ذات الترتيب العالي. على سبيل المثال:

موف إدكس، 0؛ إيدكس = 0
موف إيكس، 0FFFFFFFFh ; يتم وضع أول إضافة 32 بت في EAX
إضافة إياكس، 0FFFFFFFFh ; الإضافة الثانية 32 بت - 0x FFFFFFFFh، نضيف معاملين 32 بت
أدك إدكس، 0؛ EDX = EDX + CF، مع مراعاة المرحل
; EDX:EAX = 0000000lh:FFFFFFFEh - نتيجة 64 بت الناتجة

فريق أدكيسمح بمعالجة المعاملات الصحيحة كما في تنسيق غير موقعة، و في تنسيق موقع. عند إضافة البيانات مع علامة علامة العلمسوف يعكس EFLAGS.SF علامة النتيجة التي تم الحصول عليها. علم الفائضسيتم تعيين EFLAGS.OF على 1 إذا، عند إضافة قيم عددية موقعة ممثلة في تكملة اثنين أو تكملة اثنين، يحدث تجاوز السعة (يحمل من البت الأكثر أهمية الذي تتوافق معه البتة التي تسبق بت الإشارة)، أي، النتيجة الناتجة تتجاوز الحجم المتاح للمعامل -المواعيد ( DEST). بشكل أساسي، هذا يشبه الطريقة التي تعكس بها علامة EFLAGS.CF السعة (الحمل) عند الإضافة المعاملات غير الموقعة. على سبيل المثال، عند إضافة قيمتين 32 بت ممثلة برمز عكسي، قد يبدو الأمر كما يلي:

موف إيكس، المعامل1؛ EAX = المعامل1، يتم وضع أول إضافة 32 بت في EAX
إضافة إيكس، المعامل2؛ نضيف معاملين 32 بت في الكود العكسي
داخل ؛ انتقل إلى معالج المقاطعة في حالة تجاوز السعة

أدك إياكس، 0؛ EAX = EAX + CF، مع مراعاة الحمل (ضروري للإضافة في الرمز العكسي)
; EAX = معامل 1 + معامل 2 - نتيجة الإضافة بالرمز العكسي
جي إن إس إم 1؛ الانتقال إذا كانت النتيجة إيجابية
xor eax, 7FFFFFFFFh ; تحويل القيمة السالبة في EAX إلى رمز مستقيم
م1: ; EAX - نتيجة الإضافة في الكود المباشر

علم مساعد(أو إضافي)تحويليساعد EFLAGS.AF على معالجة البيانات بتنسيق BCD ( تنسيق BCD معبأة). يتم تعيينه إذا حدث، أثناء عملية الإضافة، نقل من رباعيات منخفضة إلى رباعيات عالية للبايت المنخفض للنتيجة. استخدام أمر DAA بعد الأمر مباشرة أدك، فمن الممكن إنتاج ما يسمى تصحيح عشرينتيجة الجمع والحصول على المبلغ في نفسه تنسيق BCD المعبأ، مثل الشروط الأصلية.

فريق أدكمع معامل الوجهة ( DEST) ، وهو متغير ذاكرة، ويمكن استخدامه مع بادئة القفل LOCK، والتي ستضمن التنفيذ الذري للأمر.

أوامر الإضافة - ADD، ADC

يمكن لتعليمات ADD (إضافة) وADC (إضافة مع حمل) إضافة معاملات 8 و16 بت.

تضيف تعليمات ADD محتويات المعامل المصدر والمعامل الوجهة وتضع النتيجة في المعامل الوجهة.

تنسيق الأمر: إضافة المتلقي، المصدر

في التدوين الرمزي، يمكن وصف أفعالها على النحو التالي: الحوض: = الحوض + المصدر (يتم كتابة مجموع محتويات الحوض والمصدر إلى الحوض).

يقوم أمر ADC بنفس عمل أمر ADD، ولكنه لا يضيف مصطلحين، بل ثلاثة مصطلحات: الوجهة، والمصدر، وعلامة الحمل.

تنسيق الأمر: جهاز استقبال ADC، المصدر + CF

في التدوين الرمزي، يمكن وصف أفعالها على النحو التالي:

الحوض: = الحوض + المصدر + محتويات علامة الحمل.

الحمل عند إضافة أرقام ثنائية يشبه الحمل عند إضافة أرقام عشرية إلى عمود. عندما يضيف الكمبيوتر أرقامًا ثنائية ولا يتناسب المجموع مع معامل الوجهة، يتم إنشاء حمل. كما تعلم، يمكن أن يحتوي السجل ذو 8 بتات على قيم غير موقعة في النطاق من 0 إلى 255. إذا قمنا، على سبيل المثال، بإجراء عملية الإضافة الثنائية للرقمين 250 و10، فسنحصل على النتيجة التالية:

1111 1010; التمثيل الثنائي للرقم 250.

0000 1010 ; التمثيل الثنائي للرقم 10.

100000100; التمثيل الثنائي للمجموع يساوي 260.

النتيجة صحيحة، ولكنها تستهلك 9 بتات ثنائية. إذا تم استخدام سجلات ذات 8 بتات، فسيتم إدخال البتات الثمانية الأقل في سجل الوجهة، والبت التاسع في علامة الحمل CF.

الآن نفهم لماذا يحتوي المعالج الدقيق 8086 على تعليمات إضافة مختلفة. يمكن لأحدها (ADD) إضافة قيم ممثلة بالبايت أو الكلمات، بالإضافة إلى الأجزاء السفلية من القيم عالية الدقة. يتم استخدام تعليمات أخرى (ADC) لإضافة قيم عالية الدقة.

يمكن أن تكون المعاملات المراد إضافتها في الذاكرة أو في السجل أو لها قيمة فورية. على سبيل المثال:

إضافة فأس، MEM_WORD؛ إضافة محتويات خلية الذاكرة إلى السجل،

أضف MEM_WORD،AX؛ أو بالعكس إضافة محتويات السجل إلى خلية الذاكرة.

أضف آل، 10؛ إضافة ثابت إلى محتويات السجل.

إضافة MEM_BYTE،8H؛ إضافة الثابت ومحتويات خلية الذاكرة.

يُسمح بمعظم المجموعات الممكنة، ولكن ممنوعإضافة محتويات خليتين ذاكرة أو استخدام قيمة مباشرة (رقم) كمستقبل.

يمكن لأوامر ADD وADC أن تؤثر على العلامات الستة التالية:

حمل العلم CF يكون 1 إذا كانت نتيجة الإضافة لا تتناسب مع معامل الوجهة، وإلا فهي 0؛

علم التكافؤ PF يكون 1 إذا كانت النتيجة تحتوي على عدد زوجي من البتات بقيمة 1، وإلا فستكون 0؛

AF يساوي 1 إذا كانت نتيجة إضافة الأرقام العشرية تتطلب التصحيح؛

العلم صفر ZF هو 1 إذا كانت النتيجة 0؛

علامة العلم SF هو 1 إذا كانت النتيجة سلبية (البت الأكثر أهمية هو 1)، وإلا فهو 0؛

علم الفائض OF يساوي 1 إذا كان مجموع رقمين من نفس الإشارة يتجاوز نطاق القيم المقبولة للمستقبل في الكود العكسي، ويقوم المتلقي نفسه بتغيير الإشارة. وبخلاف ذلك، تكون علامة OF هي 0.

أمر لزيادة قيمة جهاز الاستقبال بمقدار واحد - INC

فريق شركة(الزيادة) تضيف 1 إلى محتويات السجل أو خلية الذاكرة، ولكن على عكس تعليمة ADD، فإنها لا تؤثر على علامة الحمل CF. تنسيق الأمر: جهاز استقبال INC.

تعتبر تعليمات INC مفيدة لزيادة العدادات في حلقات التعليمات. ويمكن استخدامه أيضًا لزيادة قيمة سجل الفهرس عند الوصول إلى خلايا الذاكرة المتسلسلة. يتم تفسير المعامل كرقم غير موقع.

على سبيل المثال:

إنك سي إكس؛ زيادة قيمة 16 بت

إنك آل؛ أو تسجيل 8 بت لكل وحدة.

INC MEM_BYTE؛ زيادة قيمة البايت

إنك MEM_WORD؛ أو كلمات الذاكرة لكل وحدة.

لا يجوز استخدام قيمة فورية كمعامل.

أوامر الطرح - SUB، والطرح مع الاقتراض SBB

فرق الفرعية(طرح - طرح) و اس بي بي(الطرح مع الاقتراض) يشبه أمري الإضافة ADD وADC، على التوالي، فقط عند الطرح، تعمل علامة الحمل CF كعلامة على القرض. تنسيق الأمر: جهاز الاستقبال الفرعي، المصدر؛

يقوم الأمر SUB بطرح المعامل المصدر من المعامل الوجهة ويضع النتيجة في الوجهة، بتدوين رمزي:

بالوعة: = بالوعة - المصدر.

فريق اس بي بييفعل نفس الشيء، ولكن بالإضافة إلى ذلك يطرح قيمة إشارة حمل CF من جهاز الاستقبال:

جهاز استقبال SUB، المصدر – CF؛

الوجهة:= الحوض – المصدر – محتويات راية الحمل.

كما هو الحال مع الإضافة، تؤدي تعليمات SUB وSBB وظيفتين منفصلتين. يقوم الأمر الأول بطرح أرقام بحجم البايت أو الكلمة، بالإضافة إلى البتات ذات الترتيب المنخفض من الأرقام عالية الدقة (يوجد الجزء ذو الترتيب المنخفض من الرقم في سجل AX، والجزء ذو الترتيب العالي موجود في سجل AX) سجل DX). يقوم الأمر الثاني بطرح البتات الأكثر أهمية من الأرقام عالية الدقة. على سبيل المثال، الأمر SUB AX,CX; يطرح محتويات سجل CX من محتويات سجل AX ويعيد النتيجة إلى سجل AX.

إذا تجاوزت أحجام المعاملات 16 بت، فيجب استخدام التسلسل التالي من الأوامر:

الفأس الفرعي، CX؛ طرح 16 بت منخفضة؛

سبب بكس، دكس؛ ثم أهم 16 بت.

نحن هنا نطرح من رقم 32 بت الموجود في سجلات AX وBX الرقم 32 بت الموجود في سجلات CX وDX. عند طرح محتويات سجل DX من محتويات سجل BX، تأخذ تعليمات SBB في الاعتبار إمكانية الاقتراض عند إجراء الطرح الأول.

الفأس الفرعي، MEM؛ اطرح محتويات خلية الذاكرة من السجل.

ميم الفرعية، فأس؛ طرح سجل من خلية الذاكرة.

سوب آل، 1O؛ اطرح ثابتًا من السجل.

SUB MEM_BYTE،OFh؛ اطرح ثابتًا من خلية الذاكرة.

لا يمكن طرح مباشرةمحتويات خلية ذاكرة من أخرى، أو استخدم القيمة الفورية كوجهة.

يمكن لأوامر SUB وSBB أن تؤثر على ستة إشارات كما يلي:

· ثَبَّتَ حمل العلم CF هو 1 إذا كان القرض مطلوبًا، وإلا فهو 0؛

· ثَبَّتَ علم التكافؤ PF يكون 1 إذا كانت نتيجة الطرح تحتوي على عدد زوجي من البتات بقيمة 1، وإلا فستكون 0؛

· ثَبَّتَ علم حمل مساعد AF هو 1 إذا كانت نتيجة الطرح العشري تتطلب التصحيح، وإلا فهي 0؛

· ثَبَّتَ العلم صفر ZF إلى 1 إذا كانت النتيجة 0، وإلا فهي 0؛

· ثَبَّتَ علامة العلم SF هو 1 إذا كانت النتيجة سلبية (البت الأكثر أهمية هو 1)، وإلا فإن العلم هو 0؛

· ثَبَّتَ علم الفائض OF هو 1 إذا كانت نتيجة الطرح تتجاوز نطاق قيم جهاز الاستقبال في الكود العكسي، ويقوم جهاز الاستقبال نفسه بتغيير الإشارة.

تكون علامتا SF وOF منطقيتين فقط عند طرح الأرقام الموقعة، وتكون علامة AF منطقية فقط عند طرح الأرقام العشرية.

أمر إنقاص محتويات الوجهة - DEC

فريق جهاز استقبال ديسمبر(إنقاص) يطرح 1 من محتويات السجل أو موقع الذاكرة، ولكن (على عكس تعليمات SUB) لا يؤثر على علامة الحمل CF.

غالبًا ما يتم استخدام تعليمة DEC في حلقات لتقليل قيمة العداد حتى تصبح صفرًا أو سالبًا. يمكن استخدامه أيضًا لتقليل قيمة سجل الفهرس أو المؤشر عند الوصول إلى مواقع الذاكرة التسلسلية. على سبيل المثال:

ديسمبر CX؛ إنقاص قيمة 16 بت،

ديسمبر آل . أو تسجيل 8 بت.

ديسمبر MEM_BYTE؛ تقليل قيمة البايت،

ديسمبر MEM_WORD؛ أو خلية ذاكرة الكلمات

أوامر القسمة - DIV، IDIV

فريق DIV(قسمة - قسمة) ينفذ التقسيم غير الموقع للأرقام، والأمر IDIV(تقسيم الأعداد الصحيحة - تقسيم الأعداد الصحيحة) ينفذ التقسيم الموقع للأرقام. هذه الأوامر لها التنسيق:

مصدر DIV; أين مصدر- مقسم البايت أو حجم الكلمة،

مصدر آي دي آي في؛ يقع في سجل للأغراض العامة أو موقع الذاكرة.

يرجى ملاحظة ما يلي:

1. يجب أن يكون حجم الأرباح مضاعفًا بالنسبة للمقسوم عليه.

2. يجب أن تكون الأرباح دائمًا في سجل AX (عند القسمة على رقم 8 بت) أو في مسجلي DX وAX (عند القسمة على رقم 16 بت).

3. يتم إرجاع نتائج الأمر على النحو التالي:

· إذا كان المعامل المصدر بايتًا، فسيتم إرجاع حاصل القسمة إلى سجل AL، والباقي إلى سجل AN؛

· إذا كان المعامل المصدر كلمة، فسيتم إرجاع حاصل القسمة إلى سجل AX والباقي إلى سجل DX.

كلا التعليمتين تتركان حالة الأعلام غير محددة، ولكن إذا لم يتناسب الحاصل مع سجل الوجهة (AL أو AX)، فسيقوم المعالج الدقيق بإنشاء مقاطعة من النوع 0 (القسمة على 0).

4. يحدث تجاوز نتيجة القسمة في الحالات التالية:

· المقسوم عليه 0;

· عند تقسيم البايتات بدون إشارة، يكون المقسوم على الأقل 256 ضعف المقسوم عليه؛

· عند تقسيم الكلمات بدون إشارة يكون المقسوم على الأقل 65,536 ضعف المقسوم عليه.

· عند قسمة البايتات بإشارة، يكون الناتج خارج النطاق من -128 إلى +127؛

· عند قسمة الكلمات على الإشارة يقع خارج المدى من

من 32768 إلى 32767.

فيما يلي بعض الأمثلة النموذجية لعمليات القسمة:

ديف بكس؛ قم بتقسيم DX:AX على BX، بدون إشارة.

DIV MEM_BYTE؛ تقسيم AX إلى بايت من الذاكرة، غير موقعة.

آي دي آي في دي إل؛ اقسم AX على DL بعلامة.

IDIV MEM WORD؛ قم بتقسيم DX:AX إلى كلمة ذاكرة موقعة.

لا يتم تقسيم تعليمات DIV وIDIV مباشرة على القيمة المباشرة لأن المعالج لا يمكنه تحديد نوع بيانات المقسوم عليه.

تعليمات الضرب - MUL، IMUL

فريق مول(ضرب) ضرب الأرقام غير الموقعة، أ إيمول(ضرب الأعداد الصحيحة) ضرب الأعداد الصحيحة الموقعة. يجب أن يكون المضاعف والمضاعف لكلا التعليمات من نفس نوع البيانات، أي البايتات والكلمات والكلمات المزدوجة وما إلى ذلك.

هذه الأوامر لها التنسيق التالي:

مصدر مول; أين مصدر- سجل للأغراض العامة،

مصدر ايمول; أو خلية ذاكرة بحجم بايت أو كلمة.

كمعامل أول (قابل للمضاعفة)، تستخدم تعليمات MUL وIMUL محتويات سجل AL (للعمليات على البايتات) أو سجل AX (للعمليات على الكلمات). المنتج ذو حجم مزدوج ويتم إرجاعه على النحو التالي:

· عمليه الضرب بايت-إرجاع المنتج 16 بت إلى السجلات AN (بايت عالي) وAL (بايت منخفض)؛

· عمليه الضرب كلمات- إرجاع المنتج 32 بت إلى سجلات DX (الكلمة العالية) و AX (الكلمة المنخفضة). وبالتالي حجم المنتج ن- عوامل البت متساوية 2 ن.

إضافة ADC عدد صحيح مع الحمل

فريق أدكينفذ إضافة المعاملين الأول والثاني، مما يضيف قيمة علامة الحمل CF إلى النتيجة. يتم فقدان القيمة الأصلية للمعامل الأول (الوجهة)، ويتم استبدالها بنتيجة الإضافة. المعامل الثاني لم يتغير. باعتباره المعامل الأول للأمر أدك

يمكن أن تكون المعاملات بايت أو كلمات وتمثل أرقامًا موقعة أو غير موقعة. فريق أدك(مع الفريق يضيف) يُستخدم عادةً لإضافة أرقام 32 بت. يؤثر الأمر على أعلام OF وSF وZF وAF وPF وCF.

مثال 1:

موف فأس، 1125h أدك فأس، 2C25h؛ AX=3D4Bh، إذا كان CF = 1؛ AX=3D4Ah، إذا كان CF = 0

مثال 2:

; في حقول البيانات: numlow dw 0FFFFh; الجزء المنخفض من الحد الثاني numhigh dw 000Sh؛ الجزء الأعلى من الفصل الثاني;الرقم 0005FFFFh=393215;في مقطع البرنامج: mov AX,000Sh; جزء منخفض الترتيب من الفصل الأول mov BX,0002h؛ الجزء الأعلى من الفصل الأول;الرقم 00020005h=131077 add AX,numlow; إضافة أجزاء صغار. AX=4, CF=1 ADC BX, numhigh; إضافة أجزاء أعلى مع حمل. بكس:أكس=0008:0004h. ;الرقم 00080004h=524292

يعد استخدام معاملات 32 بت وأوضاع العنونة الإضافية لمعالجات 32 بت أمرًا مقبولاً. فريق أدكمع معاملات 32 بت، يمكن استخدامها لإضافة أعداد صحيحة 64 بت.

مثال:

; في حقول البيانات mem321 dd 0FFFFFFFFh; الجزء ذو الترتيب المنخفض من الفصل الأول mem32h dd 98765432h؛ الجزء الأعلى من الفصل الأول؛ في مقطع البرنامج mov EAX,1; جزء منخفض الترتيب من الفصل الثاني mov EBX,0; الجزء العلوي من الفصل الثاني أضف EAX,mem321; أضف النصفين السفليين؛ Sum=100000000h>32 بت؛EAX=000000h، احمل adc EBX,mem32h; قم بطي النصفين الأقدم واحملهما. إبكس=90000001h; المبلغ: 9876543300000000ح

ADD إضافة عدد صحيح

فريق يضيفينفذ إضافة المعاملين الأول والثاني. يتم فقدان القيمة الأصلية للمعامل الأول (الوجهة)، ويتم استبدالها بنتيجة الإضافة. المعامل الثاني لم يتغير. باعتباره المعامل الأول للأمر يضيفيمكنك تحديد سجل (باستثناء المقطع الأول) أو خلية ذاكرة، ويمكن أن يكون الثاني سجلاً (باستثناء المقطع الأول) أو خلية ذاكرة أو قيمة فورية، لكن لا يُسمح بتعريف كلا المعاملين في وقت واحد كذاكرة الخلايا.

يمكن أن تكون المعاملات بايت أو كلمات وتمثل أرقامًا موقعة أو غير موقعة. يمكن استخدام أمر الإضافة لإضافة الأعداد الصحيحة العادية والأرقام العشرية الثنائية (باستخدام سجل AX لتخزين النتيجة). إذا تمت إضافة أرقام عشرية مشفرة ثنائية (BCD) غير معبأة، بعد الأمر يضيفيجب استخدام الأمر aaa؛ إذا تمت إضافة أرقام معبأة، ثم الأمر نعم. يؤثر الأمر على أعلام OF وSF وZF وAF وPF وCF.

مثال 1:

Mov BX، lFFEh mov CX، 3 إضافة BX، CX؛ BX=2001h، CX=0003h

مثال 2:

موف فأس، 25 ساعة إضافة فأس، 12 ساعة؛ الفأس=0037ح

مثال 3:

; في حقول البيانات: mem dw 128؛ في مقطع البرنامج: أضف mem,100; م = 228

إضافة ADC عدد صحيح مع الحمل

يضيف الأمر adc المعاملين الأول والثاني، مما يضيف قيمة علامة الحمل CF إلى النتيجة. يتم فقدان القيمة الأصلية للمعامل الأول (الوجهة)، ويتم استبدالها بنتيجة الإضافة. المعامل الثاني لم يتغير. يمكن أن يكون المعامل الأول لتعليمة adc عبارة عن سجل (باستثناء المقطع) أو خلية ذاكرة، ويمكن أن يكون المعامل الثاني مسجلاً (باستثناء المقطع) أو خلية ذاكرة أو قيمة فورية، لكن لا يجوز تحديده كلا المعاملين في وقت واحد كخلايا الذاكرة. يمكن أن تكون المعاملات بايت أو كلمات وتمثل أرقامًا موقعة أو غير موقعة. يُستخدم أمر adc (مع أمر الإضافة) بشكل شائع لإضافة أرقام 32 بت. يؤثر الأمر على أعلام OF وSF وZF وAF وPF وCF.

مثال 1

Mov AX,1125h adc AX,2C25h ;AX=3D4Bh, إذا كان CF = 1;AX=3D4Ah, إذا كان CF = 0
مثال 2; في حقول البيانات: numlow dw 0FFFFh ;الجزء المنخفض من الفصل الثاني numhigh dw 000Sh ;الجزء العلوي من الفصل الثاني;Number 0005FFFFh=393215 ;في مقطع البرنامج: mov AX,000Sh ;الجزء المنخفض من الفصل الأول mov BX, 0002h ؛ الجزء الأعلى من الفصل الأول؛الرقم 00020005h=131077 add AX,numlow;إضافة الأجزاء السفلية. AX=4, CF=1 adc BX, numhigh; إضافة أجزاء أعلى مع;transfer.BX:AX=0008:0004h. ;الرقم 00080004h=524292
يعد استخدام معاملات 32 بت وأوضاع العنونة الإضافية لمعالجات 32 بت أمرًا مقبولاً. يمكن استخدام تعليمات adc ذات معاملات 32 بت لإضافة أعداد صحيحة 64 بت. مثال 3; في حقول البيانات mem321 dd 0FFFFFFFFh ;الجزء المنخفض من الفصل الأول mem32h dd 98765432h ;الجزء المرتفع من الفصل الأول; في مقطع البرنامج mov EAX,1 ;الجزء المنخفض من الفصل الثاني mov EBX,0 ;الجزء العلوي من الفصل الثاني أضف EAX,mem321 ;أضف النصفين المنخفضين;Sum=100000000b>32 بت;EAX=000000h، حمل adc EBX,mem32h؛ أضف النصفين الأقدم؛ ثم قم بالنقل. EBX=90000001h;المبلغ: 9876543300000000h
ADD إضافة عدد صحيح

يضيف أمر الإضافة المعاملين الأول والثاني. يتم فقدان القيمة الأصلية للمعامل الأول (الوجهة)، ويتم استبدالها بنتيجة الإضافة. المعامل الثاني لم يتغير. يمكن تحديد المعامل الأول لأمر الإضافة كسجل (باستثناء المقطع الأول) أو خلية ذاكرة، ويمكن أن يكون المعامل الثاني سجلاً (باستثناء المقطع الأول) أو خلية ذاكرة أو قيمة فورية، ولكنه لا يُسمح بتعريف كلا المعاملين في وقت واحد كخلايا ذاكرة. يمكن أن تكون المعاملات بايت أو كلمات وتمثل أرقامًا موقعة أو غير موقعة. يمكن استخدام أمر الإضافة لإضافة الأعداد الصحيحة العادية والأرقام العشرية الثنائية (باستخدام سجل AX لتخزين النتيجة). عند إضافة أرقام عشرية مشفرة ثنائية (BCD) غير مجمعة، استخدم الأمر aaa بعد أمر الإضافة؛ إذا تمت إضافة أرقام معبأة، ثم أمر daa. يؤثر الأمر على أعلام OF وSF وZF وAF وPF وCF. مثال 1

Mov BX,lFFEh mov CX,3 إضافة BX,CX ;BX=2001h, CX=0003h
مثال 2 mov AX,25h أضف AX,12h ;AX=0037h
مثال 3; في حقول البيانات: mem dw 128 ;في مقطع البرنامج: أضف mem,100 ;mem=228
مثال 4 mov AX,0507h ;BCD غير معبأ 57 إضافة AL,05h ;BCD 5, AX=050Ch aaa ;AX=0602h, BCD 62
مثال 5 mov AL، 57h؛ BCD معبأة 57 إضافة AL، 05h؛ BCD 5، AL = 5Ch daa؛ AL = 62h، BCD 62

يعد استخدام معاملات 32 بت وأوضاع العنونة الإضافية لمعالجات 32 بت أمرًا مقبولاً. مثال

موف إياكس، 98765432h إضافة إياكس، 11111111h؛ إياكس = A9876543h
ومنطقية و

يقوم الأمر and بإجراء عملية ضرب منطقية (بت) للمعامل الأول في الثاني. يتم فقدان القيمة الأصلية للمعامل الأول (الوجهة)، ويتم استبدالها بنتيجة الضرب. يمكن أن يكون المعامل الأول للأمر والأمر عبارة عن سجل (باستثناء الجزء الأول) أو خلية ذاكرة، ويمكن أن يكون المعامل الثاني سجلًا (باستثناء الجزء الأول) أو خلية ذاكرة أو قيمة فورية، لكن لا يجوز ذلك تحديد كلا المعاملين في وقت واحد كخلايا ذاكرة. يمكن أن تكون المعاملات بايت أو كلمات. يؤثر الأمر على أعلام SF وZF وPF. قواعد الضرب بالبت:

بت المعامل الأول 0101 بت المعامل الثاني 0011 بت النتيجة 0001 مثال 1موف AX، 0FFEh و AX، 5555h؛ AX = 0554h مثال 2; في حقول البيانات: mem dw 0С003h ;في مقطع البرنامج: mov AX,700Eh و AX,mem ;AX=4002h

يعد استخدام معاملات 32 بت وأوضاع العنونة الإضافية لمعالجات 32 بت أمرًا مقبولاً. مثال

موف EDX، 0FA8 8 0 0 4 lh وEDX، 0FF00000Fh؛ إدكس = FA000001h
386 ف + أربل
ضبط مستوى امتياز المحدد المطلوب

يقارن الأمر aprl المحدد بنمط يحتوي على الحد الأقصى لمستوى الامتياز المسموح به (عادةً محدد CS) ويعين القيمة المراد اختبارها إلى المستوى الأدنى من مستويي الامتياز. إذا لم يكن تغيير المستوى مطلوبًا، فسيتم إعادة تعيين علامة ZF، وإذا لزم الأمر، يتم ضبطها. يمكن أن يكون المعامل الأول لتعليمة aprl عبارة عن سجل 16 بت أو كلمة ذاكرة ذات محدد يمكن التحقق منه؛ المعامل الثاني هو تسجيل 16 بت مع محدد النمط. 386+ ملزمة
التحقق من فهرس الصفيف للصفيف خارج الحدود

يتحقق الأمر المنضم مما إذا كان الفهرس المحدد، الذي يتم التعامل معه كرقم موقع، يقع ضمن الحدود المحددة بواسطة المعامل الثاني. إذا تجاوز الفهرس حدود المصفوفة الموجودة أدناه أو أعلى، فسيتم إنشاء مقاطعة ذات ناقل 5. يجب أن يكون المعامل الأول عبارة عن سجل يحتوي على الفهرس الذي يتم فحصه، والثاني - عنوان حقل الذاكرة مع حدين للمصفوفة يجري فحصها. يسمح الأمر المنضم بالمعاملات 16 بت و32 بت (ولكن يجب أن يكون كلا المعاملين الأول والثاني من نفس النوع).

المجمع- لغة التجميع للدمى

لغة التجميع للدمى.(#2) (ج) ميخائيل سبيتسين 1995أعلام تسجيل "F" للمعالج يسمى العلم. ما هو؟ العلم هو متغير يمكن أن يكون له حالتين: ضبط (يساوي واحد) ومسح (يساوي صفر). لذلك، يمكن اعتبار السجل "F" بمثابة مجموعة من ثمانية بتات إشارة. يمكننا استخدام أربعة منها فقط: علامة الصفر، وعلم الحمل، وعلم الإشارة، وعلم تجاوز التكافؤ.عمليات حسابية. الحساب هو علم مفيد للغاية، فنحن نحسب باستمرار شيئًا ما: نجمع، نطرح، نقسم، نضرب. سنتحدث الآن عن كيفية القيام بذلك في المجمع. سنبدأ بأبسط شيء، إضافة واحد إلى شيء ما، على سبيل المثال، لتسجيل "A": *************************** *** ** LD A,NUBER INC A RET ******************************** كما ترون، فإنه من السهل جدًا أن يكون هناك أمر "INC" - زيادة (زيادة بمقدار واحد)، متبوعًا بمُعامل، أي. بعض التسجيل أو تسجيل الزوج: ******************************** INC A INC HL INC H INC DE INC E INC IY INC E INC (HL) INC (IX+N) INC (IY+N) ****************************** ** إذا كنت تريد زيادة أي خلية ذاكرة بمقدار خلية واحدة، فعليك القيام بما يلي: ******************************** ****** *** LD HL,ADDRES LD IX,ADDRES INC (HL) INC (IX+0) RET RET ********************* **************** ***** الخيار الأول يعمل بشكل أسرع وأكثر ملاءمة إذا كنت تعمل مع خلية ذاكرة واحدة، ولكن إذا كنت تعمل في جدول، فهو ليس كذلك اقتصادية وقبيحة. قارن: نحتاج إلى زيادة البايتات الأولى والخامسة والعاشرة في الجدول بمقدار واحد: ******************************* * LD HL,TABL+1 LD IX,TABL INC (HL) INC (IX+1) LD HL,TABL+5 INC (IX+5) INC (HL) INC (IX+10) LD HL,TABL+10 RET INC (HL) RET ******************************** كل ما قيل أعلاه عن الزيادة بمقدار واحد صحيح و للتناقص، أي. للتخفيض بمقدار واحد: ******************************** DEC A DEC HL DEC L DEC IX DEC H DEC DE DEC E DEC BC DEC D DEC IY DEC C DEC IX DEC B DEC (HL) DEC (IX+N) DEC (IX+N) ********************* *********** الآن لنفترض أننا بحاجة إلى زيادة السجل "A" ليس بمقدار واحد، ولكن، على سبيل المثال، بمقدار عشرة: **************** * *************** LD A,NUMBER ADD A,10 RET ************************* * ****** يمكنك إضافة السجل "A" برقم وسجلات أخرى وبخلية ذاكرة موجهة بواسطة أزواج التسجيل "HL" و"IX" و"IY". يمكنك أيضًا إضافة أزواج تسجيل باستخدام "HL" و"IX" و"IY". (PureBasic - نظام الملفات) ******************************** ADD A,N ADD A,(HL) ADD A ,A إضافة A,(IX+N) إضافة A,B إضافة A,(IY+N) إضافة A,C إضافة HL,HL ADD A,D إضافة HL,BC إضافة A,E إضافة HL,DE إضافة A,H إضافة HL، SP ADD IX، IX ADD IX، BC ADD IX، DE ADD IX، SP ****************************** ** كما ترون، مجموعة الأوامر كبيرة جدًا. عند تنفيذ هذا الأمر قد يحدث خطأ: ******************************** LD A,45 LD B,230 ADD A ,B RET ******************************** تجاوز مجموع "A" و "B" 255 و وبالتالي في "A" " لن يكون 275 ، بل 20 (التسجيل "A" ليس مطاطيًا) ؛ لإعلامنا بحدوث تجاوز السعة، يقوم المعالج بتعيين علامة الحمل على واحد. كل ما تبقى هو التحقق من ذلك. تمامًا كما يحتوي "INC" على "DEC"، فإن "ADD" يحتوي أيضًا على "زوجين"، وهذا هو "SUB"، وله خصائصه الخاصة. يعمل الأمر "SUB" فقط مع السجل "A"، لذلك عند كتابة أساليب الإستذكار لهذا الأمر، يتم حذف "A": ********************* *********** SUB N SUB C SUB A SUB H SUB B SUB D SUB E SUB (HL) SUB (IX + N) SUB (IY + N) ******** * ********************** يؤثر الأمر على علامة الحمل بنفس طريقة تأثير "ADD". بالإضافة إلى زوج الأوامر "ADD" و"SUB"، هناك زوج آخر. تعمل أوامر "ADC" و"SBC" مع مراعاة علامة الحمل، أي. عند الإضافة أو الطرح، تتم إضافة (طرح) قيمة علامة الحمل إلى النتيجة. هناك أمران خاصان لتعيين علامة الحمل - "SCF" و"CCF". "SCF" - اضبط علامة الحمل على واحد. "CCF" - اضبط علامة الحمل على الصفر. ******************************** ADC A,N SBC A,N ADC A,A SBC A,A ADC A ,H SBC A,H ADC A,L SBC A,L ADC A,D SBC A,D ADC A,E SBC A,E ADC A,B SBC A,B ADC A,C SBC A,C ADC A,( HL) SBC A،(HL) ADC A،(IX+N) SBC A،(IX+N) ADC A،(IY+N) SBC A،)IY+N) ADC HL،HL SBC HL،HL ADC HL ,BC SBC HL,BC ADC HL,DE SBC HL,DE ADC HL,SP SBC HL,SP **************************** **** والآن أمثلة على عمل الأمرين “ADC” و”SBC”: ***************************** ************ * LD A,10 LD A,10 LD B,5 LD B,5 CCF CCF SBC A,B ADC A,B RET RET A=5 B=5 A=15 B=5 ******** *********************** بدلاً من الأمرين "CCF" و"SBC A,B" أنت يمكنك ببساطة وضع "SUB B"، وستكون النتيجة هي نفسها. ******************************** LD A,10 LD A,10 LD B,5 LD B,5 SCF SCF SBC A,B ADC A,B RET RET A=4 B=5 A=16 B=5 **************************** **** كما يتبين من النتائج، فإن علامة الحمل تؤثر بشكل كبير على نتيجة العملية. عند الطرح يطرح من النتيجة، وعند الإضافة يضاف إلى النتيجة. لقد تم تناول كل شيء تقريبًا فيما يتعلق بعمليات الجمع والطرح، والآن سنتحدث عن القسمة والضرب. لسوء الحظ، لا يحتوي SPECCY على أوامر القسمة والضرب، ولكن يمكن أن تتكون هذه الأوامر من عدة أوامر أخرى. على سبيل المثال، نحتاج إلى ضرب محتويات السجلين - "A" و"C": ***************************** ********** *** LD A,10 LD C,5 LD B,A XOR A LOOP ADD A,C DJNZ LOOP RET *************** ********** ******* يوجد في المثال أمران جديدان - "XOR A" و"DJNZ LOOP". يقوم "XOR A" بمسح السجل "A"، ويكرر الأمر "DJNZ LOOP" جميع الأوامر، بدءًا من الأمر المميز بملصق (على سبيل المثال، "LOOP") إلى الأمر "DJNZ" (متبوعًا بنفس الملصق). كا، كما في بداية الدورة)؛ تم تحديد عدد التكرارات في السجل "B". باستخدام حقيقة أن ضرب M في N يضيف الرقم M إلى نفسه N مرات، يمكنك فهم المثال المذكور أعلاه. يمكن أيضًا استخدام هذه الخاصية للتقسيم. جربها بنفسك. في المرة القادمة سنتحدث عن أوامر المقارنة والعمل مع البتات.________________________________

مقالات أخرى في العدد:





قمة