هذه صفحة لقطة ثنائية اللغة تم حفظها بواسطة المستخدم في 2025-7-11 1:07 لـ https://app.immersivetranslate.com/pdf-pro/cf596247-7d67-4c70-a843-9df37bedc6d9/، مقدمة بدعم ثنائي اللغة من قبل الترجمة الغامرة. تعلم كيفية الحفظ؟

برمجة لغة التجميع Intel x86

CIS 450 - تنظيم الحاسوب وهندسته المعمارية
حقوق الطبع والنشر © 2001 تيم باور
تستخدم العديد من وحدات المعالجة المركزية نموذج آلة التجميع.
يحتوي ter على أسماء 32 بت، و16 بت، و8 بت. عادةً ما نستخدم أسماء 32 بت فقط في مخططات السجلات في الصفحات التالية.
يُسمى سجل المُراكم EAX. تُحفظ قيمة الإرجاع من استدعاء دالة في ter. سجلات المُراكم الثانوية هي: EBX، ECX، وEDX.
تم تصميمه لحمل عنوان البداية للمصفوفة.
يتم استخدامه كعداد أو سجل فهرس لمصفوفة أو حلقة.
سجل الغرض الحقيقي.
ster هو مؤشر إطار المكدس. يُستخدم لتسهيل الاتصال والعودة من
سجلات عامة الأغراض. إذا كان من المفترض أن يكون للمتغير فئة تخزين سجلات، فهي إما ESI أو EDI. تستخدم بعض التعليمات ESI وEDI كمؤشرات للمصدر والتعديل عند نسخ كتلة بيانات. تحافظ معظم المترجمات على قيمة ESI واستدعاءات الإجراءات - وهو ما لا ينطبق عادةً على سجلات التجميع.
ter هو مؤشر المكدس. وهو مؤشر إلى أعلى المكدس.
يُطلق على السجل أحيانًا اسم سجل الحالة. تُحدد العديد من التعليمات إما بتات مُعينة أو بتات كاملة في هذا السجل. على سبيل المثال، تُعتبر علامة الإشارة (البت 7) وعلامة الصفر (البت 6) تعليمات فصل (cmp)، ويتم التحقق منها بواسطة جميع تعليمات التفرع الشرطي.
يحتوي ter على مؤشر التعليمات أو عداد البرنامج (pc)، والذي يشير إلى قسم النص التالي للبرنامج الجاري تشغيله حاليًا.
التوعية والحماية
كانت وحدات المعالجة المركزية في عائلة x86 تحتوي على سجلات 16 بت، وبالتالي اقتصرت عناوين الذاكرة على 16 بت. لم تكن هذه المساحة كافية لاستيعاب الكود وبيانات العديد من المعالجات. كان الهدف تقسيم الذاكرة إلى 64 كيلوبايت. يُقسم الكود إلى مقطع واحد.
برمجة لغة مشتركة Intel x86
غزيرة الحاسوب وهندسته الحديثة CIS 450
حقوق الطبع والنشر)ه 2001 تيم باور
تستخدم وحدات المعالجة المركزية x86 |
لاحظ أن لكل سجل أسماءً بـ 32 بت، و16 بت، و8 بت. احتاج ما لدينا أسماء ذات الـ 32 بت فقط. إحالة مخططات في
سجل التراكم الرئيسي هو EAX. تُحفظ قيمة الإرجاع من الاتصال دالة في سجل EAX. جات التراكم الثانوي هي: EBX، ECX، وDX
يتم استخدام EBX غالبًا لا
غالبًا ما يتم استخدام ECX كمقياس أو سجل فهرس لـ
هو EDX
سجل EBP هو مؤشر مؤشر المكردس. لتسهيل الاتصال بالدوال منها.
EDI وEDI سجلان للأغراض العامة. إذا كان من ضمن أن يكون للمتغير فئة تخزين سجل، فغالبًا ما يُخزَّن أيضًا إما في ESI أو EDI. اختبار ESI و EDI ك مؤشرات لناوين المصدر والوجهة عند نسخة بيانات الكتلة. يحافظ على معظم المجمّعات على قيمة ESI وEDI عند الاتصال بأرشيف السجلات المشتركة.
سجل ESP هو مؤشر المكس. وهو
يُطلق حديثًا على سجل اسم الحالة EFLAGS. قم ببعض التعليمات أولاً أو قم بفحصات مختلفة في هذا السجل. على سبيل المثال، ييت (البت 7) واغ الصفري|(البت 6) بواسطة التعليمة الناشئة (Gmp)، ويتم فحصها بواسطة جميع تعليمات التفرع الثرطي.
عصر سجل EIP لإرشادات التعليمات أو عداد البرنامج (pc)، والذي يشير إلى التعليمات التالية في قسم النص الخاص به وتشغيله حاليًا.
لا تزال تحتوي على أقدم معالجات عائلة x86 على أرشيفات 16 بت، وبالتالي اختصارت عناوين الذاكرة على 16 بت (64). هذه المساحة هي بيانات وشفرات للعديد من البرامج. كان الحل هو تقسيم الذاكرة إلى كتل سليدج كل منها 64. يُقسم الكود إلى قسم واحد. 64

تسميات السجل العامة لوحدات المعالجة المركزية × 86 × 86 xx86\times 86 .

تسميات السجل العام لوحدات المعالجة المركزية x86.
31

سجل EFLAGS.

سيجم إنتريج إيستر
قاعدة إضافة ress )4M S b its(
رجال أوري

-S egn و t t tt
الوضع الحقيقي، نموذج الذاكرة المجزأة.
3
ملاحظة: إذا لم يتم إدراجه، فهذا يعني أن وحدة المعالجة المركزية محجوزة، ولا يتم تعريفها
31
سجل EFLAGS.
مو حقيقي، مو ديل الذاكرة المجزأة.

الوضع المحمي، نموذج الذاكرة المجزأة.

r، ويتم وضع المكدس في مقطع ثالث. يُعطى كل مقطع عنوانه الخاص بطول ytes. عناوين 16 بت التي يستخدمها البرنامج هي في الواقع إزاحة من ess. يُسمى هذا الوضع الحقيقي، ونموذج الذاكرة المجزأة، والتعليمات والبيانات هي عناوين أساسية محفوظة في سجل المقطع (انظر الرسم التخطيطي). سجلات المقطع (at)، وSS (مقطع المكدس)، وDS، وES، وFS، وGS (جميع مقاطع البيانات). يمكن للنموذج المجزأ أن يستوعب حجم ذاكرة يصل إلى 2 20 = 1 2 20 = 1 2^(20)=12^{20}=1 ميجابايت. يتم دمج سجل المقطع وسجل الإزاحة er. يتم إزاحة السجلين بأربعة بتات، ثم جمعهما معًا للحصول على نموذج الذاكرة المستخدم في نظام التشغيل DOS.
كان من أهم مميزات هذا الوضع سهولة كتابة برامج خاصة بالمطورين، حيث كان البرنامج يتحكم بشكل كامل في المقاطعات، إما عن طريق ترك BIOS يتولى هذه المقاطعات أو عن طريق معالجتها بنفسه. وقد نجح هذا في تشغيل أنظمة تشغيل في ذاكرة القراءة فقط، مع برامج تشغيل أساسية للأجهزة ووحدات تحكم للمقاطعات (لوحة المفاتيح، محركات الأقراص، الشاشة، الطابعة، الماوس). يُستخدم BIOS عند تشغيل نظام التشغيل. لا تستخدم أنظمة التشغيل الحديثة (يونكس، لينكس، ويندوز) نظام التشغيل قيد التشغيل (إقلاع).
في تطبيقات المعالجة، كانت قيود نظام الوضع الحقيقي مُعقّدة. لذلك، في معالج Intel 80286، كان الوضع المحمي متاحًا أيضًا. في الوضع المحمي، تتوفر الميزات التالية:
يمكن تخصيص جزء معين من الذاكرة للبرنامج. لا يمكن للبرامج الأخرى استخدام
يصل عنوان خاص إلى 64 في تباعد. العناوين 16 بت التي يستخدمها البرنامج هي في الوقع مجمو عة من عنوان قاعدة المقطع. وهذا ما جود في سجل المقطع (انظر الرسم التخطيطي). سجات المقطع هي CS (مقطع)، وSS (مقطع المكس)، وDS، وES، وFS، وGS (جميع م سجات المقطع والمجموعة غير. يتم تعيينها بأربع بتات وإضـافتهم للتوصل إلى عنوان 20 بت. هذا هو نموذج الذاكرة الذي رد تحميل نظام DOS، يبقي البرنامج بعيدا عن متاول اليد، ويتمتع بالتحكم الكامل في الحاسب الآلي المركزية. وأيضا أيضا أن يترك لك الذاكرة ولا يتطلب عدة متعددة.
أجهزة ومعالجات قسم الإدخال/الإخراج (لوحة المفاتيح، محركات الأقراص الصلبة، الشاشة، الطابعة، الفأرة). لاتخاذ BIOS عند تشغيل الحاسو . نظام تشغيل التشغيل. - نتُغيل نظام التشغيل. Intel 80286 ، أصبح الوضع المحمي متاحًا أيضًا. في الوضع المحمي، توفر هذه التطبيقات الميزات التالية: خرى الاستخدام.
وبذلك يكون كل برنامج محميًا من تدخل البرامج الأخرى.
ي: يتيح لبرنامج واحد الوصول إلى أكثر من 640 كيلوبايت من الذاكرة.
يقوم بتوسيع مساحة العنوان إلى 16 ميجا بايت للمعالجات ذات 16 بت و4 جيجابايت للمعالجات ذات 32 بت 0386 والإصدارات الأحدث).
يتيح للمعالج الدقيق التبديل من برنامج إلى آخر حتى يتمكن الكمبيوتر من تنفيذ كافة البرامج في وقت واحد.
في وضع الذاكرة المجزأة، يحتوي مقطع الكود على إزاحة في الذاكرة العالمية. يتم تخزين المزيد من التفاصيل حول عنوان القاعدة وحماية الذاكرة/حدودها. يشير GDTR إلى موقع GDT، وتحتفظ سجلات المقطع بالإزاحات، وهو مُدخل يُسمى مُوصوف المقطع في GDT (انظر الرسم التخطيطي). يستخدم نظام التشغيل Minix نموذج الذاكرة المجزأة. يبدأ Minix في هذا الوضع ويبقى في الوضع المحمي. يمكن العثور على مقالات في المراجع وعلى الإنترنت تصف كيفية انتقال برنامج DOS إلى الوضع المحمي ثم العودة إلى الوضع الحقيقي عند إغلاقه.
تستخدم أنظمة التشغيل (ويندوز ولينكس) وضعًا محميًا، ونموذج ذاكرة مسطح، وجميع عناوين أوصاف القطاعات في GDT مضبوطة على القيمة نفسها. هذا يُسهّل عملية التجزئة وحماية الذاكرة للمبرمجين.
PU - 4 بت.
تم تشغيل نظام التشغيل في الوضع الحقيقي باستخدام المقاطع.
للاستخدام فقط
الوضع المحمي. استخدمت بعض إصدارات يونكس (SC0 Xenix، minix) الوضع المحمي مع
يستخدم نظام التشغيل Windows 3.0 وLinux نموذج الذاكرة المسطحة في الوضع المحمي.
تم الآن تضمين المعالج في وحدة المعالجة المركزية.
تحتوي أجهزة Pentium الأحدث على معالج أساسي RISC.
  • معالج 64 بت.

الأوضاع

يشير ode إلى كيفية الإشارة إلى المتعاملات في تعليمات لغة التجميع. نُحاول هنا وصف أوضاع العنونة المتاحة لعائلة معالجات x86. ينسخ البيانات بين موقعين. يُوضح أدناه تركيبه النحوي - الوجهة والمصدر. تُنسخ البيانات من المصدر إلى الوجهة.
هذه الذاكرة، بحيث يكون كل برنامج محميًا من ن
الذاكرة الموسعة: خالية من برنامج الوصول إلى أكث
لا يمكن للبرامج الأخرى استخدام الذاكرة بشكل نهائي: مساحة العنوان إلى 16 ميجابايت للمعالجات 16 بت و4 جيجابايت للمعالجات وإصدارات نيت).
تعدد المهام: يتيح للمعالج الدقيق التبديل من برنامج إلى آخر حتى يتمكن الكمبيوتر من تنفيذ العديد من البرامج في وقت واحد. في نموذج الذاكرة المجزأة في الوضع المحمي، يحتوي مقطع الكود على مجمو عة في جدول الواصف العام، حيث تُخزن تفاصيل إضافية حو الذاكرة. يشير سجل خاص يُسمى GDTR إلى موقع GDT، وتحنفظ سجلات المقطع بمجموعات تشير إلى المُدخل المطلوب الُسمى واص الرسم التخطيطي). يستخدم نظام التشغيل Minix وضعًا محميًا، و هو وضع ذاكرة مجزأة. يبدأ Minix في هذا الوضع ويبقى فيه. يمكن العثو المراجع وعلى الإنترنت تصفَ كيف يُكن لبرنامج DOS تحويل المُعالج إلى الوضع المحمي ثم العودة إلى الوضع الحقيقي عند إغلاقه تستخدم أنظمة التشغيل الحديثة القائمة على x86 (ويندوز ولينكس) وضعًا محيًا في نموذج الذاكرة، حيث تُضبط جميع عناوين الذاكرة الأس في GPT على القيمة نفسها. يُبسط هذا الوضع الأمور كثيرًا، مما يجعل عملية التجزئة وحماية الذاكرة أمرًا سهلاً بالنسبة للمبرمجين.  تعدد المهام: يتيح للمعالج الدقيق التبديل من برنامج إلى آخر حتى يتمكن الكمبيوتر من تنفيذ العديد من البرامج في وقت واحد.   في نموذج الذاكرة المجزأة في الوضع المحمي، يحتوي مقطع الكود على مجمو عة في جدول الواصف العام، حيث تُخزن تفاصيل إضافية حو   الذاكرة. يشير سجل خاص يُسمى GDTR إلى موقع GDT، وتحنفظ سجلات المقطع بمجموعات تشير إلى المُدخل المطلوب الُسمى واص   الرسم التخطيطي). يستخدم نظام التشغيل Minix وضعًا محميًا، و هو وضع ذاكرة مجزأة. يبدأ Minix في هذا الوضع ويبقى فيه. يمكن العثو   المراجع وعلى الإنترنت تصفَ كيف يُكن لبرنامج DOS تحويل المُعالج إلى الوضع المحمي ثم العودة إلى الوضع الحقيقي عند إغلاقه   تستخدم أنظمة التشغيل الحديثة القائمة على x86 (ويندوز ولينكس) وضعًا محيًا في نموذج الذاكرة، حيث تُضبط جميع عناوين الذاكرة الأس   في GPT على القيمة نفسها. يُبسط هذا الوضع الأمور كثيرًا، مما يجعل عملية التجزئة وحماية الذاكرة أمرًا سهلاً بالنسبة للمبرمجين.  {:[" تعدد المهام: يتيح للمعالج الدقيق التبديل من برنامج إلى آخر حتى يتمكن الكمبيوتر من تنفيذ العديد من البرامج في وقت واحد. "],[" في نموذج الذاكرة المجزأة في الوضع المحمي، يحتوي مقطع الكود على مجمو عة في جدول الواصف العام، حيث تُخزن تفاصيل إضافية حو "],[" الذاكرة. يشير سجل خاص يُسمى GDTR إلى موقع GDT، وتحنفظ سجلات المقطع بمجموعات تشير إلى المُدخل المطلوب الُسمى واص "],[" الرسم التخطيطي). يستخدم نظام التشغيل Minix وضعًا محميًا، و هو وضع ذاكرة مجزأة. يبدأ Minix في هذا الوضع ويبقى فيه. يمكن العثو "],[" المراجع وعلى الإنترنت تصفَ كيف يُكن لبرنامج DOS تحويل المُعالج إلى الوضع المحمي ثم العودة إلى الوضع الحقيقي عند إغلاقه "],[" تستخدم أنظمة التشغيل الحديثة القائمة على x86 (ويندوز ولينكس) وضعًا محيًا في نموذج الذاكرة، حيث تُضبط جميع عناوين الذاكرة الأس "],[" في GPT على القيمة نفسها. يُبسط هذا الوضع الأمور كثيرًا، مما يجعل عملية التجزئة وحماية الذاكرة أمرًا سهلاً بالنسبة للمبرمجين. "]:}\begin{aligned} & \text { تعدد المهام: يتيح للمعالج الدقيق التبديل من برنامج إلى آخر حتى يتمكن الكمبيوتر من تنفيذ العديد من البرامج في وقت واحد. } \\ & \text { في نموذج الذاكرة المجزأة في الوضع المحمي، يحتوي مقطع الكود على مجمو عة في جدول الواصف العام، حيث تُخزن تفاصيل إضافية حو } \\ & \text { الذاكرة. يشير سجل خاص يُسمى GDTR إلى موقع GDT، وتحنفظ سجلات المقطع بمجموعات تشير إلى المُدخل المطلوب الُسمى واص } \\ & \text { الرسم التخطيطي). يستخدم نظام التشغيل Minix وضعًا محميًا، و هو وضع ذاكرة مجزأة. يبدأ Minix في هذا الوضع ويبقى فيه. يمكن العثو } \\ & \text { المراجع وعلى الإنترنت تصفَ كيف يُكن لبرنامج DOS تحويل المُعالج إلى الوضع المحمي ثم العودة إلى الوضع الحقيقي عند إغلاقه } \\ & \text { تستخدم أنظمة التشغيل الحديثة القائمة على x86 (ويندوز ولينكس) وضعًا محيًا في نموذج الذاكرة، حيث تُضبط جميع عناوين الذاكرة الأس } \\ & \text { في GPT على القيمة نفسها. يُبسط هذا الوضع الأمور كثيرًا، مما يجعل عملية التجزئة وحماية الذاكرة أمرًا سهلاً بالنسبة للمبرمجين. } \end{aligned}تعددالمهاميتيحللمعالجالدقيقالتبديلمنبرنامجإلىآخرحتىيتمكنالكمبيوترمنتنفيذالعديدمنالبرامجفيوقتواحدفينموذجالذاكرةالمجزأةفيالوضعالمحمي،يحتويمقطعالكودعلىمجموعةفيجدولالواصفالعام،حيثتُخزنتفاصيلإضافيةحوالذاكرةيشيرسجلخاصيُسمىإلىموقع،وتحنفظسجلاتالمقطعبمجموعاتتشيرإلىالمُدخلالمطلوبالُسمىواصالرسمالتخطيطييستخدمنظامالتشغيلوضعًامحميًا،وهووضعذاكرةمجزأةيبدأفيهذاالوضعويبقىفيهيمكنالعثوالمراجعوعلىالإنترنتتصفَكيفيُكنلبرنامجتحويلالمُعالجإلىالوضعالمحميثمالعودةإلىالوضعالحقيقيعندإغلاقهتستخدمأنظمةالتشغيلالحديثةالقائمةعلىويندوزولينكسوضعًامحيًافينموذجالذاكرة،حيثتُضبطجميععناوينالذاكرةالأسفيعلىالقيمةنفسهايُبسطهذاالوضعالأموركثيرًا،ممايجعلعمليةالتجزئةوحمايةالذاكرةأمرًاسهلاًبالنسبةللمبرمجين
f t f t ftf t
أول وحدة معالجة مركزية من ث
وحدة المعالجة المركزية 8 بت. تم تشغيل نظام تشغيل DOS في الوضع الحقيّ
وحدة المعالي
80186 للخ
80286 أكمل إضافة وضع محمي. تستخدم بعض إصدارات يونكس (SCO Xenix، minix) وضعًا محميًا مع مقاطع.
وحدة المعالجة المركزية|38 بت. يستخدم نظام التشغيل Windows 3.0 وLinux وضع الحماي
تم الآن تضمين معالج الرياضيات في وحدة
بنتيوم سريع. ن بنتيوم
أم معروف أيضدًا باسم IA-64
يشير إلى وضع العنونة إلى كيفية التركيز إلى المُعاملات في تعليمات لغة التجميع. سنستخدم أداة mov هنا لوصف وسائل العنونة المتاحة لعائات mov البيانات بين موقعين. صيغتها الواضحة أدناه، حيث تمثل كلٌ من الوجهة والمصدر المُعاملات. تُنسخ البيانات من المصدر إلى الوجهة.
مُعامل وضع السجل يُسمّي سجلًا ببساطة. كلا المُعاملين يستخدمان وضع السجل، حيث ننسخ محتويات السجل ECX إلى السجل EAX. يُرجى ملاحظة أن أسماء السجلات مُشتقة في شيفرة التجميع.

بورصة إي سي إكس

متغير الوضع الفوري هو ثابت مُدرج مباشرةً في الكود. أدناه، نستخدم المتغير الثاني لتخزين القيمة 10 في سجل EAX. يجب أن يكون متغير الوضع هو المتغير المصدر.
(في SPARC، يُسمى هذا الوضع نفسه "مباشرة من السجل"). هنا نستخدم سجلًا إلى r (عنوان في الذاكرة الرئيسية) حيث يمكن نقل البيانات منه وإليه. لا يمكن أن يكون كلا المتغيرين غير مباشر من السجل - يجب أن يكون أحدهما في أي من وضعي السجل. توضع أقواس حول المتغير للإشارة إلى غير مباشر من السجل. في لغة C، يمكن اعتبار الأقواس عامل إلغاء المرجع. تستخدم بعض المترجمات ts، بينما يستخدم البعض الآخر الأقواس.
X], EDX ; contents of edx goes to address pointed to by eax.
    [edx] ; data at address pointed to by edx goes to ebx.
emicolon designates the beginning of a comment for some
ers.
    assemblers use the exclamation mark for comments.
يمكن أيضًا إضافة ثوابت أو إزاحات من 8 أو 16 أو 32 بت إلى محتويات العنوان الفعال. كما هو موضح أدناه، هناك عدة أشكال للقاعدة - يجب أن يكون المتغير الآخر المقترن بمتغير إزاحة القاعدة إما في الوضع الفوري أو الوضع الفوري.
, 16 [ EBP ] 16 [ EBP ] 16[EBP]16[\mathrm{EBP}] ; ; ;; البيانات في 16 + EBP 16 + EBP 16+EBP16+\mathrm{EBP} تذهب إلى EBX
, [ ebp + 16 ] [ ebp + 16 ] [ebp+16][\mathrm{ebp}+16] ; ; ;; نفس ما ورد أعلاه
[ ebp ] 16 [ ebp ] 16 [ebp]16[\mathrm{ebp}] 16 ; ; ;; نفس ما ورد أعلاه
I ] [ EBP ] , 10 I ] [ EBP ] , 10 I][EBP],10\mathrm{I}][\mathrm{EBP}], 10 ; 10 ; 10 ;10; 10 يذهب إلى EDI+EBP
I ] [ EBP + 16 ] , 18 I ] [ EBP + 16 ] , 18 I][EBP+16],18\mathrm{I}][\mathrm{EBP}+16], 18 ; 18 ; 18 ;18; 18 يذهب إلى EDI+EBP+16
, 16[EBP] ; data at 16+EBP goes to EBX ,[ebp+16] ; same as above [ebp]16 ; same as above I][EBP],10 ;10 goes to EDI+EBP I][EBP+16],18 ;18 goes to EDI+EBP+16| , $16[\mathrm{EBP}]$ | $;$ data at $16+\mathrm{EBP}$ goes to EBX | | :--- | :--- | | ,$[\mathrm{ebp}+16]$ | $;$ same as above | | $[\mathrm{ebp}] 16$ | $;$ same as above | | $\mathrm{I}][\mathrm{EBP}], 10$ | $; 10$ goes to EDI+EBP | | $\mathrm{I}][\mathrm{EBP}+16], 18$ | $; 18$ goes to EDI+EBP+16 |
تتمثل إحدى وظائف تعليمة النقل في نقل 32 بت (كلمة مزدوجة) من البيانات. تحدد بعض لغات البرمجة (مثل C++) نوع العملية، حتى لو كانت افتراضية.
هناك عدة طرق لتحديد كمية أقل من البيانات المراد نسخها. التعليمات التالية تنسخ ١٦ بت (كلمة) من البيانات.
د بتر [EBX]
(ب ب)، 3
يمكن استخدام e أو تسمية 8 بت للسجل لنسخ 8 بت من البيانات.
سجل Mo de، يُطلق على مُعامل سجل mo de name. كلاهوح
أدناه. هنا نسخة تحتوي على سجل ECX إلى سجل EAX. يرجى ملاحظة أن أسماء السجات لا راعي لها في كود الاتحاد.
5
المتغير هو الاسم الثابت مُكمّل الشيفون في الكود. فيما يلي، استخدم المتغير الفوري مع المتغير الثناني لقيمة 10 في سجل EAX. يج الرصيد هو المتغير المصدر
موف إي
سجل غير مباشر (في SPARC، يُطلق على نفس الوضع الاسم
احنفظ بوصول نقطة (العنوان في الذاكرة الرئيسية) التي يمكن نقل البيانات منها وإليها. لا يمكن أن يكون كلخ المتعاملين في التعليم غير مباح
يجب أن يكون أحد التعاملين إما مسجلاً بشكل غير مباشر أو مسجاً مبانشرًا. وضع أقواس حول المتعامل للإشارة إلى غير مباشر بالسجات. يمكن لعامل إلغاء المرجع درجة الائتمان. تستخدم بعض المترجمات الأقواس الشاملة، بينما يستخدم بعض الأقواس.
؛ ننقل محتويات edx إلى العنوان الذي يشير إليه
edx توجد البيانات الموجودة في العنوان الذي يتجه إليه ؛mov ebx، [edx]
؛ تشير بفاصلة منقوطة إلى بداية التعليق لبعض المجمات.
!تستخدم المجمعات الأخرى العلامة التجارية
يمكن أيضًا إضافة الثوابت الأساسية أو المجموعات المكونة من 8
سجلٌّ للحصول على عنوان فعال. كما هو موضح أدناه، هناك عدة تطبيقات لازاحة المجموعة. يجب أن يكون المُعمل الآخر الدقترن بدُعامل إزاحة السجل (mo) أو الوضع للرصيد (النموذج).
BP mov [EDI] [EBP+16]، ينتقل إلى 10 ؛mov [EDI] [EBP]، 10
18؛ 18 ينتقل إلى EDI+EBP+16
الطريقة الافتازادية باستخدام سيارة النقل هي نقل 32 بت (كلمة مزدوجة) من البيانات. بعض المترجمات (مثل MS Visual C++) تتصرف بطريقة افتراضية.
PTR [EBX]
هناك في الوقع عدة طرق أصغر حجما من بيانات المرادفات نسخةها. فيما يلي أمثلة على نسخ 17 بت (كلمة) من البيانات.
PTR [EBX] mov
موف -6(ebp)، 3
يمكن استخدام الكلمة الأساسية بايت أو الاتصال 8}بت للسلع

الإجراءات

بالنسبة للتعليمات، يتم استخدام الرموز التالية للإشارة إلى العنوان المقبول
تعريف
متغير وضع التسجيل
متغير الوضع الفوري (ثابت)
المتعامل هو عنوان ذاكرة، إما أن يكون تسجيلًا غير مباشر أو تسجيلًا أساسيًا
التعليمات الأكثر استخدامًا فقط. معلومات حول إضافة دليل Intel (/pub/cis450/Pentium.pdf أو /pub/cis450/x86In في التعليمات)
nly the most commonly used instructions. Information on add he Intel manual (/pub/cis450/Pentium.pdf or /pub/cis450/x86In at Instructions| nly the most commonly used instructions. Information on add he Intel manual (/pub/cis450/Pentium.pdf or /pub/cis450/x86In | | :--- | | at Instructions |
المهمات ملحوظات
ذاكرة فورية، ذاكرة فورية، ذاكرة فورية نسخ البيانات movb ينسخ بايت واحد من الوجهة، ويتم استبدال الوجهة المصدر
تسجيل فوري للعضو نسخ البيانات مع علامة التمديد
تسجيل فوري للعضو نسخ البيانات بدون تمديد
نيد نسخ البيانات إلى أعلى المكدس (esp) يتم تقليل مؤشر المكدس (ESP) بمقدار 4 بايت.
نسخ البيانات من أعلى المكدس إلى سجل يتم زيادة مؤشر المكدس (ESP) بمقدار 4 بايت.
ميم تحميل مؤشر (عنوان الذاكرة) في سجل
Definition register mode operand immediate mode operand (a constant) operand is a memory address, either register indirect or base dis "nly the most commonly used instructions. Information on add he Intel manual (/pub/cis450/Pentium.pdf or /pub/cis450/x86In at Instructions" erands Notes immed reg mem n, immed n, reg Copy data movb copies one byte destination, source destination is overwritten immed reg mem Copy data with sign extend immed reg mem Copy data with zero extend ned Copy data to the top of the stack (esp) The stack pointer (ESP) is decremented by 4 bytes. Copy data from the top of the stack to a register The stack pointer (ESP) is incremented by 4 bytes. mem Load a pointer (memory address) in a register| Definition | | | :--- | :--- | | register mode operand | | | immediate mode operand (a constant) | | | operand is a memory address, either register indirect or base dis | | | nly the most commonly used instructions. Information on add he Intel manual (/pub/cis450/Pentium.pdf or /pub/cis450/x86In <br> at Instructions | | | | | | erands | Notes | | immed reg mem n, immed n, reg | Copy data movb copies one byte destination, source destination is overwritten | | immed reg mem | Copy data with sign extend | | immed reg mem | Copy data with zero extend | | ned | Copy data to the top of the stack (esp) The stack pointer (ESP) is decremented by 4 bytes. | | | Copy data from the top of the stack to a register The stack pointer (ESP) is incremented by 4 bytes. | | mem | Load a pointer (memory address) in a register |

تعليمات نيتيك

يجب أن يكون المتحكم لجميع هذه التعليمات أحد سجلات التراكم (EAX،
في أوصـاف التعليمات، يتم كتابة الكتابة التالية للإشارة إلى الطرق السريعة السريعة.
i
سجل التسجيل وضع النشغيل الفوري وضع التشغيل التشغيل (ثابت) السجل هو عنوان الذاكرة، إما سجل غير مبانشر أو عامل إزاحة قاعدة.
i سجل التسجيل وضع النشغيل الفوري وضع التشغيل (ثابت) السجل هو عنوان ذاكرة، إما سجل غير مبانشر أو عامل إزاحة قاعدة. | i | | :--- | | سجل التسجيل وضع النشغيل الفوري وضع التشغيل (ثابت) السجل هو عنوان ذاكرة، إما سجل غير مبانشر أو عامل إزاحة قاعدة. | | | | |
450/Pentium.p df/) Intel هذه هي التعليمات الأكثر استخدامًا فقط. يمكنك الحصول على معلومات إضافية حول تعليمات الدليل .(pub/cis450/x86Instructions.ps/
على سبيل المثال s reg movk
، نسخة البيانات على سجل سجل mov reg، ذاكرة الوجه، ovsx بذاكرة، سجل
، نسخ البيانات على الفور mov reg سجل، ذاكرة الوجهة، ovsx بذاكرة، سجل| ، نسخ البيانات على الفور mov reg | | :--- | | سجل، ذاكرة الوجهة، | | ovsx بذاكرة، سجل |
المصدر، ذاكرة ت امجل، فوري
ريج، أنا m نسخة البيانات باستخدام علامة تمديد ريج، ريج
g دفع ريج، أنا
m نسخة البيانات مع صفر تمديد ريج، ريج المكدس (خاصة)
m نسخ البيانات مع صفر تمديد reg، reg المكدس (خاصة)| m نسخ البيانات مع صفر تمديد reg، reg | | :--- | | المكدس (خاصة) |
4 4 يتم تقليل مؤشر المكس
سخ البيان
يتم زيادة معدل التسجيل (ESP) بمقدار 4 بايت.
reg يتم زيادة مؤشر المكدس (ESP) بمقدار 4 بايت.| reg | | :--- | | يتم زيادة مؤشر المكدس (ESP) بمقدار 4 بايت. |
قس بالتفصيل عنوان سجل ليا،
eg s reg movk "، نسخ البيانات على الفور mov reg سجل، ذاكرة الوجهة، ovsx بذاكرة، سجل" مصدر ذاكرة، ت امجل، فوري reg, me m نسخ البيانات باستخدام علامة تمديد reg, reg g دفع reg، me "m نسخ البيانات مع صفر تمديد reg، reg المكدس (خاصة)" 4 بمقدار 4 يتم تقليل مؤشر المكس سخ البيان "reg يتم زيادة مؤشر المكدس (ESP) بمقدار 4 بايت." ق بتحميل عنوان سجل ليا،| eg s reg movk | ، نسخ البيانات على الفور mov reg <br> سجل، ذاكرة الوجهة، <br> ovsx بذاكرة، سجل | | :--- | :--- | | مصدر ذاكرة، ت امجل، فوري | | | reg, me | m نسخ البيانات باستخدام علامة تمديد reg, reg | | g دفع reg، me | m نسخ البيانات مع صفر تمديد reg، reg <br> المكدس (خاصة) | | 4 بمقدار 4 | يتم تقليل مؤشر المكس | | سخ البيان | reg <br> يتم زيادة مؤشر المكدس (ESP) بمقدار 4 بايت. | | | | | ق بتحميل عنوان | سجل ليا، |
يجب أن يكون سجل الوجهة لجميع هذه التعليمات أحد سجات التراكم (EAX، EBX، ECX، EDX).
المهمات ملحوظات
عضو مسجل يتم استخدام المتغير الأول في إضافة المكمل الثاني كمصدر ويتم استبداله كوجهة
عضو مسجل يتم استخدام المتغير الأول لطرح المكمل الثاني كمصدر ويتم استبداله كوجهة
زيادة القيمة في السجل
تقليل القيمة في السجل
المعكوس الجمعي
X، X مسجل، X فوري، ذاكرة الضرب غير الموقّع: يميل بعض المجمّعين إلى استخدام imul بدلاً من ذلك
عضو مسجل الضرب الموقّع، EAX*reg rarr\rightarrow EAX
n قسمة غير موقعة EAX / reg,mem؛ EAX = الحاصل، EDX = الباقي،
n القسمة الموقعة EAX / reg,mem؛ EAX = الحاصل، EDX = الباقي،
erands Notes reg immed mem two's compliment addition first operand is used as source and overwritten as destination reg immed mem two's compliment subtraction first operand is used as source and overwritten as destination increment the value in register decrement the value in register additive inverse X, reg X, immed X, mem Unsigned multiply Some compilers tend to use imul instead reg immed mem Signed multiply, EAX*reg rarr EAX n Unsigned divide EAX / reg,mem; EAX = quotient, EDX = remainder, n Signed divide EAX / reg,mem; EAX = quotient, EDX = remainder,| erands | Notes | | :--- | :--- | | reg immed mem | two's compliment addition first operand is used as source and overwritten as destination | | reg immed mem | two's compliment subtraction first operand is used as source and overwritten as destination | | | increment the value in register | | | decrement the value in register | | | additive inverse | | X, reg X, immed X, mem | Unsigned multiply Some compilers tend to use imul instead | | reg immed mem | Signed multiply, EAX*reg $\rightarrow$ EAX | | n | Unsigned divide EAX / reg,mem; EAX = quotient, EDX = remainder, | | n | Signed divide EAX / reg,mem; EAX = quotient, EDX = remainder, |

ملف لغة التجميع

تعليمات التجميع، هناك بعض التصريحات الأخرى في برنامج بلغة التجميع. عناصر برنامج لغة التجميع. هذه الملاحظات خاصة بفرق Minix عن برامج التجميع الأخرى.

تهذيب

مقاطع التجميع: النص، ذاكرة القراءة فقط (ROM)، البيانات، وBSS. يتم إعلان المقاطع وتحديدها. من المعتاد إعلان جميع المقاطع في أعلى ملف التجميع كما يلي:
.sect .rom; .sect .data; .sect .bss
في جسم الكود، يتم استخدام إعلانات القطاعات لبدء الإعلانات لكل قطاع. يشير الرمز ." إلى الموقع في القطاع الحالي.
الاسم والرقم. تتكون تسميات الأسماء من اسم متبوع بنقطتين (😃). الأرقام هي أرقام مفردة. أقرب تسمية 0: يمكن الإشارة إليها كـ 0 f في الأمام.
مثلا إضافة fi reg، mem كمصدر استبداله كوجهة reg، immed المعامل الأول بتث استخدام
طرح الدك القيمة في السجل ة زبأة reg، mem inc reg ييث استخدام الطلق الأول كمصدر الكتابة فوقه كوجهة ،تسجيل سجل neg reg مضاف معكوس مول EAX، reg تسجيل غير موقّع
استخدام imul بد ذهبت بعض المترجمين إلى EAX، immed reg Signed multiply، EAX*reg
يمينًا يمينًا
على سبيل المثال، ذاكرة div ريج
idiv reg حاصلة على التخصص، EAX = EDX = الجاقي، EAX 6AX / reg,mem
= EDX : الحاصل، EAX ؛mem EAX / reg,mem
eg إضافة fi reg، mem كمصدر ويتم استبداله كوجهة reg، immed rst operand بتث استخدام طرح الدك القيمة في السجل ة زبأة reg، mem inc reg يتث استخدام المشغل الفوري الأول كمصدر ويتم الكتابة فوقه كوجهة ،reg السجل neg reg مضاف معكوس mul EAX، reg ضرب غير موقّع ستخدام imul بد يميل بعض الدترجمين إلى EAX، immed reg Signed multiply، EAX*reg يمينً يمينًا eg، mem div reg idiv reg حاصل القسمة، EAX = EDX = الجاقي، EAX 6AX / reg,mem = EDX : الحاصل، EAX ؛mem EAX / reg,mem| eg إضافة | fi reg، mem كمصدر ويتم استبداله كوجهة reg، immed rst operand بتث استخدام | | :--- | :--- | | طرح الدك القيمة في السجل | ة زبأة reg، mem inc reg يتث استخدام المشغل الفوري الأول كمصدر ويتم الكتابة فوقه كوجهة ،reg السجل neg reg مضاف معكوس mul EAX، reg ضرب غير موقّع | | | | | | | | | | | ستخدام imul بد | يميل بعض الدترجمين إلى EAX، immed reg Signed multiply، EAX*reg | | | | | يمينً يمينًا | | | | | | eg، mem div | reg | | | idiv reg حاصل القسمة، EAX = EDX = الجاقي، EAX 6AX / reg,mem | | | = EDX : الحاصل، EAX ؛mem EAX / reg,mem |
fi
.بالإضافة إلى تعليمات التجميع، هناك عدد قليل من الإعلانات الأخرى في برنامج لغة التجميع التي ينتجها المترجم. نستعرض هنا عناصر برنامج بلغة النجميع. هذه الماحظات خاصة بمجمّع Minix. قد تختلف بعض الثيء عن المجمّعات الأخرى.
هناك أربعة قطاعات تجميع مختلفة: نص، ذاكرة للقراءة فقط، بيانات، وBSS. يتم إعلان القطاعات واختيار ها بواسطة العملية شبه العلية. م في أعلى ملف التجميع كمf يلي:
.طائفة .نص؛ .طائفة .مائفة. .
بعد ذلك، داخل نص الكود، ثُشتخم إعانات المقاطع لبدء إعانات كل مقطع. لاحظ أن الرمز ‘.’ يشير إلى الموقع في المقط الحالي.
هناك نو عان: اسمي ورقمي. تتكون علامات الاسم
الأرقام المختبرية هي أرقام أحادية. أقرب رقم 0: يكن الإثارة إلى رقم المختبر كـ Of في الاتجاه الأمامي، أو Ob في الاتجاه الخلفي.
tax tax tax\operatorname{tax}
a single statement. Blank or comment lines are allowed.
1 form of an instruction is
e operand1, operand2 ! comment

oles and the Stack

store local variables. They may be put on the stack with either the push instruction space on the stack (subtract from esp) and then using the mov instruction to store 1 space. Here we will show an example of how local variables are used from the stack. ack is upside down from how stacks are normally viewed in that the “top” of the stack ry address of the stack data. The processor maintains a special register (ESP) which mory address which is the top of the stack. Another important register associated frame pointer (EBP). The frame pointer is sort of a book mark or reference point all memory references are relative to the frame pointer. Management of the frame how functions are called and more importantly, how the program returns to the action calls will covered in more detail later.
ement a restriction that each function may only access (i.e. scope) those elements on within the function’s Activation Record. The Activation Record for each function g:
neters
ter quad longleftarrow\quad \longleftarrow frame pointer (ebp)
longleftarrow\longleftarrow stack pointer (esp)
ame pointer at the beginning of each function (including main), the following two de are used.
rame pointer is pushed onto the stack for use when the function returns to the calling Then, since the the old frame pointer is now at the top of the stack, we can use the esp register to copy a pointer to where the old frame pointer was stored to the ebp the new frame pointer.
example of how local variables in the stack are managed. Try to draw a memory map
ينكون كل سطر من جملة واحدة. يُسمح باستخ
الثكل
operand2 العلامة: رمز العملية
الـا
تُستخدم المكدة لتخزين المتغيرات المحلية. يمكن إضافتها إليها إما باستخدام تعليمة الدفع (Push) أو بتخصيص مساحة عليها أولًا (طرح النقل (Move) لتخزين البيانات في المساحة المخصصة. سنعرض هنا مثالًا على كيفية استخدام المتغيرات المحلية من المكدسة. تذكر أن المكدس مقلوب رأسًا على عقب، مقارنةً بالطريقة المعتادة لعرض المكدسات، حيث يحمل الجزء العلوي من المكدس أدنى عنوان ذا المعالج بسجل خاص (ESP) يُشير إلى عنوان الذاكرة الموجود في أعلى المكدس. هناك سجل مهم آخر مرتبط بالمكدس وهو مؤشر الإطار بمثابة علامة مرجعية أو نقطة مرجعية في المكدس. ترتبط جميع مراجع الذاكرة تقريبًا بمؤشر الإطار. تُعد إدارة مؤشر الإطار أمرًا بالغ الأِ والأهم من ذلك، لكيفية عودة البرنامج إلى الدالة المستدعية. سيتم تناول استدعاءات الدوال بمزيد من التفصيل لاحقًا. تُطبّق مُجمّعات C قيدًا يُككّن كل دالة من الوصول فقط (أي نطاق) إلى عناصر المكدس المُدرجة ضمن سجل تنشيط الدالة. يتضمن سجل تنظ

larr\leftarrow larr\leftarrow مؤشر المكدس (esp)p ointer (ebp) lo cal متغيرات الإطارلإعداد مؤشر الإطار في بداية كل وظيفة (بما في ذلك الوظيفة الرئيسية)، يتم استخدام السطرين التاليين من كود التجميع.موف إيأولاً، يُدفع مؤشر الإطار القديم إلى المكدس لاستخدامه عند عودة الدالة إلى الدالة الأصلية (الدالة المُستدعية). بعد ذلك، بما أن مؤشر الإطار المكدس، يُكننا استخدام قيمة المؤشر في سجل esp لنسخ مؤشر ap إلى مكان تخزين مؤشر الإطار القديم في سجل ebp، ليصبح هذا مؤذفيما يلي مثال بسيط لكيفية إدارة المتغيرات المحلية في المكدس. حاول رسم خريطة ذاكرة للمكدس.

.sect .text; .sect .rom; .sect .data; .sect .bss
.extern _main
.sect .text
_main:
push ebp
mov ebp,esp
sub esp,12
push esi
movb -1(ebp),97
mov esi,10
o16 mov -10(ebp),5
movsx eax,-10(ebp)
add esi,eax
pop esi
leave
ret
lls and the Stack
ed to store data that is used for making calls to functions. Data is pushed onto the on is called and is removed from the stack when the function returns.
mpilers implement a restriction that each function may only access (i.e. scope) those k which are within the function’s Activation Record. The Activation Record for es the following:
neters
ter quad longleftarrow\quad \longleftarrow frame pointer (ebp)
longleftarrow\longleftarrow stack pointer (esp)
unction are the same for every C function. It should be pointed out that this is the 1pilers. Some assembly programmers follow this scheme for hand written assembly embly programmers never worry about setting the frame pointer.
action pushes the function parameters onto the stack prior to the function call.
ction pushes the return address (EIP register) onto the stack which is used on function (return) instruction which loads the EIP register with this address.
assembly code) pushes the old frame pointer onto the stack and sets the EBP register s location on the stack.
esp
esi،eax إضافة بوب إيسي
بيتركي
تُستخدم المكدسة أيضًا لتخزين البيانات اللازمة لاستدعاء الدوال. تُدفع البيانات إلى المكس عند استدعاء دالة، وثُزال منه عند عودة الدالة. تذكي أن مُجمِّعات لغة C تُطبّق قيدًا يُمكِّن كل دالة من الوصول فقط (أي نطاق) إلى عناصر المكدس الموجودة ضمن سجل تنشيط الدالة. يته
p ointer (ebp) lo cal متغيرأشرأ الإكدالس
خطوات الدالة هي نفسها لجميع دوال C. تجدر الإشارة إلى أن هذا هو المخطط الذي تستخدمه المُجمِّعات. يتبع بعض مبرمجي التجميع هذا الـ يدويًا. لكن العديد من مبرمجي التجميع لا يكترثون أبدًا بضبط مؤشر الإطار .
  1. تقوم الوظيفة المستدعية بدفع معمات الوظيفة إلى الـ
  2. تقوم تعليمات الاستدعاء بدفع عنوان الإرجاع (سجل EIP) إلى المكدس والذي يتم استخدامه عند خروج الوظيفة بواسطة تعليمات ret) سجل EIP بهذا العنوان. تقوم الوظيفة (رمز التجميع) بدفع مؤشر الإطار القديم إلى المكس وتعيين سجل EBP للإشارة إلى هذا الموقع على المكدس.
    ecution of the function, the frame pointer is used as a reference point to the rest of the activation record. On function exit, the leave instruction loads the EBP register d d dd value so that when control returns to the calling function, the frame pointer is still
    are stored on the stack and are removed from the stack when the function exits.
    returns data to the calling function, the return value is placed in the EAX register. action removes and discards the function parameters when control is return from the
    action looks to the EAX register for a return value.
    (int j j jj ، int k k kk )
k c
j b
i a
ret addr
old fp <--- fp (ebp)
x
y
z <--- sp (esp)
k c j b i a ret addr old fp <--- fp (ebp) x y z <--- sp (esp)| k | c | | | :---: | :---: | :--- | | j | b | | | i | a | | | | ret addr | | | | old fp | <--- fp (ebp) | | | x | | | | y | | | | z | <--- sp (esp) |
s related to function calls are:
الموقع الجديد (تعيين eip إلى موقع التعليمات للوظيفة المستدعاة). ebp - التخلص من المتغيرات المحلية
  • إعادة تعيين مؤشر الإطار إلى القيمة القديمة - تعيين الكمبيوتر الشخصي للعودة إلى وظيفة الاستدعاء
    ords وdisposable - n يكون دائمًا تقريبًا 0.
    مثال شامل، حاول رسم خريطة ذاكرة. تحقق من خريطة الذاكرة باستخدام sted في صفحة ويب الفئة لـ a.c. يتضمن هذا المثال أمثلة على global وe محفوظة في قسم bss والبيانات في الذاكرة.
    dio.h>
5;
أنت، أنت)؛
؛ ــ أثناء تنفيذ الدالة، ومؤشر الإطار كنقطة مرجعية لبقية الذاكرة في سجل التشيط. عند خروج الدالة، تُنِتَتَنِتِلُو سجل BP؛ بحيث يختفي مؤشر الإطار الصحيح عند عودة التحكم إلى الدالة المستدائية.
يتم تخزين المكدس محليًا وينتهي من المكد
إذا قامت الوظيفة بإرجاع البيانات إلى الوظيفة المستدعية، ينم وضع قيمة الإ
قيام الوظيفة المستدعاة بإزاء معلمات الوظيفة والتخلص منها عند إرجاع التحكم من الوظيفة.
وظيفة الاستدعاء للبحث عن سجل EAX للحصص
ك ا ج
ج ا ب ا
أنا | ا ا
    | القيم ret | | fp ---> عنوان |
        | (ebp) | x | | y
أنت ج، أنت ك) باطل { … !ي، ز
z ∣< s p (esp) | z ∣< s p  (esp) |  z∣<---sp" (esp) | "z \mid<---s p \text { (esp) | }
بعض التعليمات التعليمية
2. انتقل إلى الموقع الجديد (اضبط eip على موقع التعليمات لوظيفة الذ
اترك 1. هوف esp،ebp
2 2 ص المرجع ebp | إعادة تعيين مؤشر الإطار
| ret n n nn 1. pop op eip
2. انسخ n كلمة وتخلص منها | نك,
المثال المثال أكثر شمولاً، حاول رسم خريطة. تحقق من خريطة الذاكرة لايك باستخدام خريطة الذاكرة المنشورة على صفحة الويب فئة البيانات العامة والمحفوظة في قسم bss والبيانات في الذاكرة.
، int b b bb ، int c c cc )
نص؛ .sect .rom؛ .sect .data؛ .sect .bss
5! gdata = 5 = 5 =5=5 في قسم البيانات
p ! احفظ مؤشر الإطار القديم
،خصوصًا ! مؤشر الإطار الجديد يذهب إلى ebp
,4 ! laauto1 = -4(ebp)
i ! laauto3 = esi -- ملاحظة: قم بالتسجيل دون السؤال
i ! laauto2 = edi
بسس
_1,4 ! 4 بايت في bss (I_1) لـ int lbss ثابت
نص
p ! save old frame pointer ,esp ! new frame pointer goes to ebp ,4 ! lauto1 = -4(ebp) i ! lauto3 = esi -- note: register without asking i ! lauto2 = edi bss _1,4 ! 4 bytes in bss (I_1) for static int lbss text | p | ! save old frame pointer | | :--- | :--- | | ,esp | ! new frame pointer goes to ebp | | ,4 | ! lauto1 = -4(ebp) | | i | ! lauto3 = esi -- note: register without asking | | i | ! lauto2 = edi | | bss | | | _1,4 | ! 4 bytes in bss (I_1) for static int lbss | | text | |
ain(void) { int laauto1،
ss ثابت لاوتو2، لاوتو3
:o2 = 5 !laauto1 = f(gdata, gbss, lbss) !lbss = 20
intf("%d %d %d\n"، laauto1، laauto2، ؛laauto3 = 15
اطبع ("%d\n")، f( laauto3، laauto2، 5)) ؛ laauto3)
(أنت أ، أنت ب، أنت ج)
سينت إي سينت د
1 .طائفة .نص؛ .طائفة .rom؛ .طائفة. 1
2
45 ! 45 ! 45!45! بيانات g = 5.6 = 5.6 =5.6=5.6
9 ادفع ebp! اح
!mov ebp، esp 10
11 فرعي (ebp)- 4 =
12 دفع هذا ! laauto3 = esi - - ملخظة:
13 ادفع الطبعة
sss (I_1) بايت في comm I_1,4 ! 4. 15
bss)،10 ! gbss = 10
, 20
1) ، إي دي إكس ! lbss (I_1) = edx = 20
x
(gbss) ! ادفع المعلمات بالترتيب العكسي
بيانات جيدة)
,12 ! إزالة المعلمات من المكدس
ebp) ،eax ! laauto1 = f(...)
,5 ! laauto2 = 5
, 15 ! laauto3 = 15
i
i ! ادفع المعلمات بالترتيب العكسي
(ebp)
2 ! التنسيق ... "%d %d %dn"
رينتف
,16 ! إزالة المعلمات
i
i
,12 ! إزالة المعلمات
x ! ادفع قيمة الإرجاع إلى المكدس
3 ! التنسيق ... "%dn"
رينتف
،إياكس ! العودة 0
! استعادة السجلات
! استعادة مؤشر الإطار القديم من المكدس
! عنوان الإرجاع يأتي من المكدس
ذاكرة للقراءة فقط ! rom هو جزء من النص
680997 ! التنسيق ... "%dn"
! التنسيق ... "%d %d %dn"
622879781
1680154724
10
نص
p ! احفظ مؤشر الإطار القديم
،خصوصًا ! مؤشر الإطار الجديد يذهب إلى ebp
,4 ! e = -4(ebp)
bss),10 ! gbss = 10 , 20 1) ,edx ! lbss (I_1) = edx = 20 x gbss) ! push params in reverse order gdata) ,12 ! remove params from stack ebp) ,eax ! lauto1 = f(...) ,5 ! lauto2 = 5 , 15 ! lauto3 = 15 i i ! push params in reverse order (ebp) 2 ! format ... "%d %d %d n" rintf ,16 ! remove params i i ,12 ! remove params x ! push return value to stack 3 ! format ... "%d n" rintf ,eax ! return 0 ! restore registers ! restore old frame pointer from stack ! return address comes from stack rom ! rom is part of text 680997 ! format ... "%d n" ! format ... "%d %d %d n" 622879781 1680154724 _f 10 text p ! save old frame pointer ,esp ! new frame pointer goes to ebp ,4 ! e = -4(ebp)| bss),10 | ! gbss = 10 | | :--- | :--- | | , 20 | | | 1) ,edx | ! lbss (I_1) = edx = 20 | | x | | | gbss) | ! push params in reverse order | | gdata) | | | ,12 | ! remove params from stack | | ebp) ,eax | ! lauto1 = f(...) | | ,5 | ! lauto2 = 5 | | , 15 | ! lauto3 = 15 | | i | | | i | ! push params in reverse order | | (ebp) | | | 2 | ! format ... "%d %d %d n" | | rintf | | | ,16 | ! remove params | | i | | | i | | | ,12 | ! remove params | | x | ! push return value to stack | | 3 | ! format ... "%d n" | | rintf | | | ,eax | ! return 0 | | | ! restore registers | | | ! restore old frame pointer from stack | | | ! return address comes from stack | | rom | ! rom is part of text | | 680997 | ! format ... "%d n" | | | ! format ... "%d %d %d n" | | 622879781 | | | 1680154724 | | | _f | | | 10 | | | text | | | p | ! save old frame pointer | | ,esp | ! new frame pointer goes to ebp | | ,4 | ! e = -4(ebp) |
! gbss = 1017 نص
رطل ثانية ( ( (( I_1 ) = ) = )=)= edx = 2019 = 2019 =2019=2019
ادفع الم ! دفع (_gbss) 21
24 إضافة خاصة،12! إزال
),eax ! laauto1 = f 25 = f 25 =f 25=f 25
أوتو2 = 526 = 526 =526=526
27 حركة 15 = 37
29 ادفع الطبعة! ادفع الد
31 ادفع I_2 ! تنسيق .
33 إضافة 16
38 إضافة 12
39 ادفع كل واحد ! ادفع قيه
40 ادفع I_3 !
! بوب إي سي إكس 43
x، eax 44
ص 46
47 اتزك ! مؤشر قياس الا
48
ct .rom ! rom. 49
! data4 680997. 51
. ! I_2 52
. 53
4. 54
59 ادفع ebp! اح
mov ebp 60 61 فر عديد،
! أضف المعلمات ( a , b , c a , b , c a,b,c\mathrm{a}, \mathrm{b}, \mathrm{c} )
! edx = d*a
! استعادة مؤشر الإطار القديم من المكدس
! عنوان الإرجاع يأتي من المكدس

التعليمات

تيونس
erands Notes
عدم منطقي (عملية المكمل الواحد)
تسجيل ميم فوري منطقي و
تسجيل ميم فوري منطقي أو
تسجيل ميم فوري منطقية xor
ريج ميم فوري ن، فوري قارن النتيجة (dest - source) في EFLAGS sf و zf راجع تعليمات التحكم
تسجيل ميم فوري منطقية، ويتم تعيين EFLAGS بناءً على النتيجة، راجع تعليمات التحكم
erands Notes logical not (one's complement operation) reg mem immed logical and reg mem immed logical or reg mem immed logical xor reg mem immed n, immed Compare (dest - source) result in EFLAGS sf and zf see control instructions reg mem immed logical and, EFLAGS set based on result see control instructions| erands | Notes | | :--- | :--- | | | logical not (one's complement operation) | | reg mem immed | logical and | | reg mem immed | logical or | | reg mem immed | logical xor | | reg mem immed n, immed | Compare (dest - source) result in EFLAGS sf and zf see control instructions | | reg mem immed | logical and, EFLAGS set based on result see control instructions |
يُحرّك البتات عددًا محددًا من المواضع إلى اليمين أو اليسار. تُملأ المواضع غير المُعدّلة ببت صفري. يُجري الإزاحة الحسابية العملية نفسها، باستثناء الإشارة d. يسمح هذا الاختلاف لعملية الإزاحة بتوفير آلية سريعة لأيٍّ من
(I_4) بايت في comm I_4,4 ! 4.63
65
66 أضف (edx،8(ebp ) أضف
67
68 أضف a + b + c
9
70 ميكرولتز x = d*a
ملاحظة -- لا حاجة لحفظ ;mov eax,edx ! return e 71
72 اتزك ! استعادة مؤشر الا
73
4
bss بايت في comm _gbss,4 ! 4.76
reg، reg و منطقيًا (علية المكم) و
em logical reg، reg
المند reg، mem
يمينًا
reg، immed cmp reg، reg
قارن (dest - المصدر)
reg، immed cmp reg، reg قارن (dest - المصدر)| reg، immed cmp reg، reg | | :--- | | قارن (dest - المصدر) |
EFLAGS sf يؤدي إلى reg، mem
تعليمات التحكم mem، immed اختبار
EFLAGS sf يؤدي إلى reg، mem تعليمات التحكم mem، immed اختبار| EFLAGS sf يؤدي إلى reg، mem | | :--- | | تعليمات التحكم mem، immed اختبار |
التحكم على الفور
https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-28.jpg?height=40&width=961&top_left_y=2210&top_left_x=2 التحكم على الفور| ![](https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-28.jpg?height=40&width=961&top_left_y=2210&top_left_x=2) | | :--- | | التحكم على الفور |
(I_4) بايت في comm I_4,4 ! 4.63 65 66 أضف (edx،8(ebp ) أضف 67 68 أضف a + b + c 9 70 ميكرولتز x = d*a ملاحظة -- لا حاجة لحفظ ;mov eax,edx ! return e 71 72 اتزك ! استعادة مؤشر الا 73 4 bss بايت في comm _gbss,4 ! 4.76 reg، reg و منطقيًا (علية المكم) و em logical reg، reg المند reg، mem يمينًا "reg، immed cmp reg، reg قارن (dest - المصدر)" "EFLAGS sf يؤدي إلى reg، mem تعليمات التحكم mem، immed اختبار" "https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-28.jpg?height=40&width=961&top_left_y=2210&top_left_x=2 التحكم على الفور" | (I_4) بايت في comm I_4,4 ! 4.63 | | | :--- | :--- | | 65 | | | 66 أضف (edx،8(ebp ) أضف | | | 67 | | | 68 أضف a + b + c | | | 9 | | | 70 ميكرولتز x = d*a | | | ملاحظة -- لا حاجة لحفظ ;mov eax,edx ! return e 71 | | | 72 اتزك ! استعادة مؤشر الا | | | 73 | | | 4 | | | bss بايت في comm _gbss,4 ! 4.76 | | | | reg، reg و منطقيًا (علية المكم) و | | em logical reg، reg | | | المند reg، mem | | | يمينًا | | | | reg، immed cmp reg، reg <br> قارن (dest - المصدر) | | EFLAGS sf يؤدي إلى reg، mem <br> تعليمات التحكم mem، immed اختبار | | | ![](https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-28.jpg?height=40&width=961&top_left_y=2210&top_left_x=2) <br> التحكم على الفور | |
يُحرّك الإزاحة المنطقية البتات إلى عدد مُحدّد من المواضع إلى اليمين أو اليسار . ثُماً المواضع التي لا تُملاً بعلية الإزاحة بيت صفري. يُ
fi نفسه، باستثناء أن بت الإشارة ييقى دائمًا. يسمح هذا الاختلاف لعملية الإزاحة بتوفير آلية سريعة لـ
Log ica lSh iftR igh t
A ritm etic ShiftR igh t
Rotate Sh iffR ght
تدوير Shift إلى اليمبن
's complement numbers by 2 .
erands Notes
immed arithmetic shift left
immed logical shift left
immed arithmetic shift right
immed logical shift right
immed rotate shift left
immed rotate shift right
erands Notes immed arithmetic shift left immed logical shift left immed arithmetic shift right immed logical shift right immed rotate shift left immed rotate shift right| erands | Notes | | :--- | :--- | | immed | arithmetic shift left | | immed | logical shift left | | immed | arithmetic shift right | | immed | logical shift right | | immed | rotate shift left | | immed | rotate shift right |
ly and Divide by factor of 2
ctions
actions are used to implement various control constructs (if, while, do while, for). instructions follow a cmp or test instruction and evaluate the sign and zero flag (SF, GS register. For each of these instructions, the operand is the name of a label found
low on control flow for examples of how they are used.
المهمات ملحوظات
] unconditional jump
] jump if greater than zero
1 jump if greater than or equal to zero
1 jump if less than zero
1 jump if less than or equal to zero
1 jump if zero
l jump if not zero
erands Notes ] unconditional jump ] jump if greater than zero 1 jump if greater than or equal to zero 1 jump if less than zero 1 jump if less than or equal to zero 1 jump if zero l jump if not zero| erands | Notes | | :--- | :--- | | ] | unconditional jump | | ] | jump if greater than zero | | 1 | jump if greater than or equal to zero | | 1 | jump if less than zero | | 1 | jump if less than or equal to zero | | 1 | jump if zero | | l | jump if not zero |
actions
nstructions can be used to implements looping constructs, but there are also some just for the purpose of looping.
اضرب أو
hl reg ، سار إزاحة حسابية فورية إلى ال sal reg
إلى اليمين، اليسار، sar reg، إزاحة حسابية فوري
ي للجزاحة إل! فوريتَ إلى اليمين، rol reg، تدوير فو
فوري للجزاحة إلى اليمين
اضرب أو hl reg ، سار إزاحة حسابية فورية إلى ال sal reg إلى اليمين، اليسار، sar reg، إزاحة حسابية فوري ي للجزاحة إل! فوريتَ إلى اليمين، rol reg، تدوير فو فوري للجزاحة إلى اليمين | اضرب أو | | | :--- | :--- | | | | | hl reg ، سار | إزاحة حسابية فورية إلى ال sal reg | | إلى اليمين، | اليسار، sar reg، إزاحة حسابية فوري | | ي للجزاحة إل! | فوريتَ إلى اليمين، rol reg، تدوير فو | | | فوري للجزاحة إلى اليمين | | | | | | | | | |
تُستخدم التُعليمات الثلالية لتنفيذ بنيات تحكم متتو عة (if، while، do while، for). تتجع تعليمات الفرع الثرطي تعليمة cmp أو test، وتُقيّ .EFLAGS فكل من هذه التعليمات، يكون العامل هو اسم مختبر el الموجود في ملف التجميع (SF، ZF)
راجع الماحظات أدناه حول ال甲||كم في التخفق للحصول
من الصفر مختبر jmp القزة غير المشروطة مختبر jg القزة إذا كانت أكبر
من الصفر jne مختبر jz
'
'
-
.
.
من الصفر مختبر jmp القزة غير المشروطة مختبر jg القزة إذا كانت أكبر من الصفر jne مختبر jz ' ' - . .| من الصفر | مختبر jmp القزة غير المشروطة مختبر jg القزة إذا كانت أكبر | | :--- | :--- | | من الصفر | jne مختبر jz | | | ' | | | ' | | | - | | | | | | . | | | | | | . |
يمكن استخدام تعليمات التحكم المذكورة أعلاه لتنفيذ بنيات التكرار الحلقي، ولكن هناك أيضًا بعض التعليمات الخاصة لغرض النكرار الحلقي.
المهمات ملحوظات
1 decrement ecx and if ecx is not equal to zero, jump
ruction
jump if ZF in EFLAGS is set and ecx is not equal to zero
ecx is decremented
jump if ZF in EFLAGS is set and ecx is not equal to zero ecx is decremented| jump if ZF in EFLAGS is set and ecx is not equal to zero | | :--- | | ecx is decremented |
erands Notes 1 decrement ecx and if ecx is not equal to zero, jump ruction "jump if ZF in EFLAGS is set and ecx is not equal to zero ecx is decremented"| erands | Notes | | :--- | :--- | | 1 | decrement ecx and if ecx is not equal to zero, jump | | ruction | jump if ZF in EFLAGS is set and ecx is not equal to zero <br> ecx is decremented |

g Instructions

re all used to copy data from one string to another. In each case the source location while destination is the address in edi. After the move, the esi and edi registers are and decremented by the appropriate amount depending on the direction flag (DF) in r. If DF is 0 (CLD instruction was executed), the registers are incremented. If DF n was executed), the registers are decremented.
ملحوظات
بايت واحد من [esi] إلى [edi]
كلمة واحدة (2 بايت) من [esi] إلى [edi]
Notes e one byte from [esi] to [edi] e one word (2 bytes) from [esi] to [edi]| Notes | | :--- | | e one byte from [esi] to [edi] | | e one word (2 bytes) from [esi] to [edi] |
مثال:
O(ebp) ! الوجهة
O(ebp) ! المصدر
! نسخ 10 بايت
! زيادة esi و edi
! انقل 10 بايتات، واحدة تلو الأخرى
تعليمات
ملحوظات
هو علم الاتجاه؛ يستخدم مع تعليمات حركة السلسلة
علم الاتجاه؛ يستخدم مع تعليمات حركة الوتر
ar أو تعطيل المقاطعات؛ محجوز لنظام التشغيل
أو تمكين المقاطعات؛ محجوز لنظام التشغيل
عملية، تُستخدم لجعل موقع الذاكرة قابلاً للعنونة
Notes ar the direction flag; used with string movement instructions the direction flag; used with string movement instructions ar or disable interrupts; Reserved for the OS or enable interrupts; Reserved for the OS peration, used to make a memory location addressable| Notes | | :--- | | ar the direction flag; used with string movement instructions | | the direction flag; used with string movement instructions | | ar or disable interrupts; Reserved for the OS | | or enable interrupts; Reserved for the OS | | peration, used to make a memory location addressable |
GS في ZF حلقة op lab خام ecx وإذا لم يكن ecx مساويًا للصفر، القز حلقة op e lab القز إذا تم تعيينه
ecx ينم تقلبل
أعلام حنى ecx يتم فحص المختبر إذا لم يتم تعيين ZF بنسبة ecx عن طريق تنفيذ التعليمات والتوجيهات
GS في ZF حلقة op lab تقليل ecx وإذا لم يكن ecx مساويًا للصفر، القز حلقة op e lab القز إذا تم تعيين ecx ينم تقلبل FLAGS حنى ecx افتح المختبر إذا لم يتم تعيين ZF يتم تقليل قيمة ecx عن طريق تنفيذ التعليمات وتقليل قي | GS في ZF | حلقة op lab تقليل ecx وإذا لم يكن ecx مساويًا للصفر، القز حلقة op e lab القز إذا تم تعيين | | :--- | :--- | | | ecx ينم تقلبل | | FLAGS حنى ecx | افتح المختبر إذا لم يتم تعيين ZF يتم تقليل قيمة ecx عن طريق تنفيذ التعليمات وتقليل قي | | | |
وبالتالي جميع هذه التعليمات لنسخ البيانات من سلسلة إلى أخرى. في تسعة الحالتين، يكون الموقع المصدر هو العنوان في esi، بينما يكون عنواز زيادة أو عيوبـان سجل esi Weedi بالقيمة الصحيحة، وبالتالي يعتمد على اتجاه (DF) ag في سجل EFLAGS. إذا كانت قيمة DF تساوي 0 (تم تت السجات. أما إذا كانو قيمة DF تساوي 1 (تم تنفيذ تعليمة STD)، فتتم إنقاص السجات.
ينقل بايت واحد من movsb movsw [edi] إلى movs
[edi] تيار مباشر مزدوج (4 بايت) من [esi] إلى movsd [edi]
! الدصد ! ليا esi، -40(ebp) الوجهة! ليا إيدي، -20(إب)
النسخة 10 بايت cld ! زد esi و edi مندوب movsb! انقل 10 با
يستخدم توجيهات التوجيه والتحكم std بتعيين اتجاه اتجاه cld المقاطحات او جونسونها؛ محجوز للتحكم في التشغيل sti تعيين المقاطحات اوصاتهاق للتحكم في التشغيل
لجعل موقع الذاكرة قابلاً للعنونة
تعليمات
المهمات ملحوظات
ميناء قراءة البيانات وحفظها في eax أو ax أو al. المنفذ هو عنوان الذاكرة الأساسي للجهاز الذي تتم القراءة منه (مثل بطاقة الصوت).
ميناء اكتب البيانات في eax أو ax أو al إلى منفذ الإدخال/الإخراج.
قراءة بيانات السلسلة وحفظها في الذاكرة. يُؤخذ منفذ الإدخال/الإخراج من سجل edx (مثل لوحة المفاتيح أو المنفذ التسلسلي). أما الوجهة، فيؤخذ من سجل edi. عند استخدامها في حلقة أو مع rep، يزداد عنوان الوجهة أو ينقص حسب علامة الاتجاه.
اكتب بيانات السلسلة من الذاكرة إلى منفذ الإدخال/الإخراج. يُؤخذ منفذ الإدخال/الإخراج من سجل edx (مثل لوحة المفاتيح أو المنفذ التسلسلي). أما المصدر فيؤخذ من سجل esi. عند استخدامه في حلقة أو مع rep، يزداد عنوان المصدر أو ينقص حسب علامة الاتجاه.
erands Notes port Read data in and save to eax, ax or al. The port is the base memory address for the hardware being read from (eg., a sound card). port Write data in eax, ax or al to an I/O port. Read string data in and save to memory. The I/O port is taken from the edx register (eg., a keyboard or serial port). The destination is taken from the edi register. If used in a loop or with rep, the destination address is incremented or decremented depending on the direction flag. Write string data from memory to I/O port. The I/O port is taken from the edx register (eg., a keyboard or serial port). The source is taken from the esi register. If used in a loop or with rep, the source address is incremented or decremented depending on the direction flag.| erands | Notes | | :--- | :--- | | port | Read data in and save to eax, ax or al. The port is the base memory address for the hardware being read from (eg., a sound card). | | port | Write data in eax, ax or al to an I/O port. | | | Read string data in and save to memory. The I/O port is taken from the edx register (eg., a keyboard or serial port). The destination is taken from the edi register. If used in a loop or with rep, the destination address is incremented or decremented depending on the direction flag. | | | Write string data from memory to I/O port. The I/O port is taken from the edx register (eg., a keyboard or serial port). The source is taken from the esi register. If used in a loop or with rep, the source address is incremented or decremented depending on the direction flag. |
هـ، التعليمات المستخدمة لتنفيذ بنيات التحكم هي الأشكال المختلفة من التعليمات، وعادة ما يتم إنجازها باستخدام تعليمات المقارنة (cmp) لتقييم تعليمة القفزة الشرطية المنطقية.
و آل أو فأس في acc,p، اقرأ البيانات في منفذ eax هو عنوان الذاكرة الأساسية للأجهزة التي يتم قراءتها منها (على سبيل المثال، بطاقة الصوت).
إخراج. إنسو منابة الييانات في eax أو ax أو al إلى منف الامتداد/ aut ac,p port
أخذ منفذ الإدخال/الإخراج من سجل edx (مثل لوحة المفاتيح أو المنفذ التسلسلي). أما الوجه، فتؤخذ من سجل edi. عند استخدامه في حلقة تُشغيل أو مع ممثل، مختلف عنوان الوجه أو ينقص تبعًا للاتجاه ag.
كتابة بيانات السلسلة من الذاكرة إلى الإدخال/الإخراج outsb outsw المنفذ. يتم أخذ منفذ الإدخال/الإخراج من سجل edx (على سبيل المثال، لوحة المفاتيح أو المنفذ التسلسلي). يُوُتُخذ المصدر من سجل esi. عند استخدامه في حلقة المرجع أو مع .ag عنوان السبب أو ينقصه حسب نهايات نيويورك ،rep fl
و al أو ax في acc,p، اقرأ البيانات في eax المنفذ هو عنوان الذاكرة الأساسية للأجهزة التي يتم القراءة منها (على سبيل المثال، بطاقة الصوت). إخراج. insw منابة الييانات في eax أو ax أو al إلى منف إدخال/ aut acc,p port بُؤخذ منفذ الإدخال/الإخراج من سجل edx (مثل لوحة المفاتيح أو المنفذ التسلسلي). أما الوجهة، فتؤخذ من سجل edi. عند استخدامها في حلقة تُشغيل أو مع rep، يزداد عنوان الوجهة أو ينقص تبعًا للاتجاه ag. كتابة بيانات السلسلة من الذاكرة إلى الإدخال/الإخراج outsb outsw المنفذ. يتم أخذ منفذ الإدخال/الإخراج من سجل edx (على سبيل المثال، لوحة مفاتيح أو منفذ تسلسلي). يُوُخذ المصدر من سجل esi. عند استخدامه في حلقة op أو مع .ag يزداد عنوان المصدر أو ينقص حسب النهاية باتجاه ،rep fl| و al أو ax | في acc,p، اقرأ البيانات في eax المنفذ هو عنوان الذاكرة الأساسية للأجهزة التي يتم القراءة منها (على سبيل المثال، بطاقة الصوت). | | :--- | :--- | | إخراج. insw | منابة الييانات في eax أو ax أو al إلى منف إدخال/ aut acc,p port | | | بُؤخذ منفذ الإدخال/الإخراج من سجل edx (مثل لوحة المفاتيح أو المنفذ التسلسلي). أما الوجهة، فتؤخذ من سجل edi. عند استخدامها في حلقة تُشغيل أو مع rep، يزداد عنوان الوجهة أو ينقص تبعًا للاتجاه ag. | | | كتابة بيانات السلسلة من الذاكرة إلى الإدخال/الإخراج outsb outsw المنفذ. يتم أخذ منفذ الإدخال/الإخراج من سجل edx (على سبيل المثال، لوحة مفاتيح أو منفذ تسلسلي). يُوُخذ المصدر من سجل esi. عند استخدامه في حلقة op أو مع .ag يزداد عنوان المصدر أو ينقص حسب النهاية باتجاه ،rep fl |
في لغة موحدة، التعليمات البرمجية المستخدمة لبنيات التحكم هي أوب مختلفة من التعليمات الانتقال. يتم تقديم ذلك باستخدام مقارنة التعليم (cmp انتقال شرطية.
كود لغة التجميع، 28 سلبي ; ب -> إياكس
لن يتم إعدام الجثة؛ 29 sub DWORD PTR _a$[ebp]، eax
العبارة المختارة هي الاختبارات إذا كانت 30
انظر. 31 ; 8 : سي++؛
32
33 بما في ذلك DWORD PTR _c$[ebp]
34 $L28:
35 ل24:
36
37 ; 9 : }
38 ; 10 : }
39
40 إصدار بوب
41 بوب إيسي
42 بوب إي بي إكس
43 يترك
44 ret 0
45 _رئيسي ENDP
46 TEXT ENDS
NT 47 END
NEAR
p
خاصة
12
x
i
لي
تا، ب، ج؛ إذا كان الأمر كذلك
(أ <= 17) {
PTR _a$[ebp]، 17
إذا (تعبير) {
a = a b ; a = a b ; a=a-b;\mathrm{a}=\mathrm{a}-\mathrm{b} ;
} آخر {
eax؛ 0 -> eax الجسم 2
DWORD PTR _b$[ebp] }
assembly language code, the 28 neg eax ; b -> eax e will not execute the body; 29 sub DWORD PTR _a$[ebp], eax statement chosen tests if the 30 se. 31 ; 8 : c++; 32 33 inc DWORD PTR _c$[ebp] 34 $L28: 35 $L24: 36 37 ; 9 : } 38 ; 10 : } 39 40 pop edi 41 pop esi 42 pop ebx 43 leave 44 ret 0 45 _main ENDP 46 TEXT ENDS NT 47 END NEAR p esp 12 x i li t a, b, c; if else (a <= 17) { PTR _a$[ebp], 17 if( expr ) { a=a-b; } else { eax ; 0 -> eax body2 DWORD PTR _b$[ebp] } | assembly language code, the | 28 | | neg eax | | ; b -> eax | | :--- | :--- | :--- | :--- | :--- | :--- | | e will not execute the body; | 29 | | | | sub DWORD PTR _a$[ebp], eax | | statement chosen tests if the | 30 | | | | | | se. | 31 | ; 8 | : | c++; | | | | 32 | | | | | | | 33 | | | | inc DWORD PTR _c$[ebp] | | | 34 | $L28: | | | | | | 35 | $L24: | | | | | | 36 | | | | | | | 37 | ; 9 | : } | | | | | 38 | ; 10 | : } | | | | | 39 | | | | | | | 40 | | pop edi | | | | | 41 | | pop esi | | | | | 42 | | pop ebx | | | | | 43 | | leave | | | | | 44 | | ret 0 | | | | | 45 | _main | ENDP | | | | | 46 | TEXT | ENDS | | | | NT | 47 | END | | | | | NEAR | | | | | | | p | | | | | | | esp | | | | | | | 12 | | | | | | | x | | | | | | | i | | | | | | | li | | | | | | | t a, b, c; | if else | | | | | | (a <= 17) { | | | | | | | PTR _a$[ebp], 17 | | | | | | | | | if( expr ) { | | | | | $\mathrm{a}=\mathrm{a}-\mathrm{b} ;$ | | | | | | | | | } else { | | | | | eax ; 0 -> eax | | body2 | | | | | DWORD PTR _b$[ebp] | } | | | | |
لا سيما أنه في لغة مشتركة، يتم إجراء القزة إذا لم ننفذ ب -> eax ؛neg eax 28 المختار يختبر ما إذا كان تقييم التعبير خاطئًا.
29 فرعي 3130 ؛DWORD PTR _a$[ebp]، eax DWORD PTR _c$[ebp] 34 +c 32 بما في ذلك 32 بـ 32 :$L28: 35 $L24
36 { : 9 ; 37 { : 10 ; 38 39 40 إصدارًا شعييًا 41 بوب إيسي 42 بوب إي بي إكس 43 إجازة ret 044 ENDP الرئيسية 45 46 _نهاية النص 47 نهاية 36 { : 9 ; 37  { :  10 38 39 40  إصدارًا شعييًا  41  بوب إيسي  42  بوب إي بي إكس  43  إجازة   ret  044  ENDP الرئيسية  45 46  _نهاية النص  47  نهاية  {:[36],[{:9;37],[" { : "10"; "38],[39],[40" إصدارًا شعييًا "],[41" بوب إيسي "],[42" بوب إي بي إكس "],[43" إجازة "],[" ret "044],[" ENDP الرئيسية "45],[46" _نهاية النص "],[47" نهاية "]:}\begin{aligned} & 36 \\ & \{: 9 ; 37 \\ & \text { \{ : } 10 \text {; } 38 \\ & 39 \\ & 40 \text { إصدارًا شعييًا } \\ & 41 \text { بوب إيسي } \\ & 42 \text { بوب إي بي إكس } \\ & 43 \text { إجازة } \\ & \text { ret } 044 \\ & \text { ENDP الرئيسية } 45 \\ & 46 \text { _نهاية النص } \\ & 47 \text { نهاية } \end{aligned}إصدارًاشعييًابوبإيسيبوبإيبيإكسإجازةالرئيسيةنهايةالنصنهاية
8 int a، b، c :4 1716 _a$[ebp]، 1722 } (17 a - b :7 ijg $L28 2324
إذا كان الأمر كذلك
إذا (تعيير) الجسم 1 آخر 2 } { {  إذا (تعيير) الجسم  1  آخر  2  }   {   {  {:[" إذا (تعيير) الجسم "1" آخر "2],[" } "],[" { "],[" { "]:}\begin{aligned} & \text { إذا (تعيير) الجسم } 1 \text { آخر } 2 \\ & \text { \} } \\ & \text { \{ } \\ & \text { \{ } \end{aligned}إذاتعييرالجسمآخر
; 2 : void main(){
    push ebp
    mov ebp, esp
    sub esp, 12
    push ebx
    push esi
    push edi
; 3 : int a, b, c;
; 4 :
; 5 : if (a <= 17) {
    cmp DWORD PTR _a$[ebp], 17
    jg $L28
; 6 : a = a - b;
    xor eax, eax
    sub eax, DWORD PTR _b$[ebp]
    neg eax
    sub DWORD PTR _a$[ebp], eax
; 7 : c++;
    inc DWORD PTR _c$[ebp]
; 8 : } else {
    jmp $L29
$L28:
; 9 : b = a;
    mov eax, DWORD PTR _a$[ebp]
    mov DWORD PTR _b$[ebp], eax
; 10 : c = b;
    mov eax, DWORD PTR _b$[ebp]
    mov DWORD PTR _c$[ebp], eax
$L29:
$L24:
void main(){ 9 : 2 ؛ 8
10 دفعات ebp 11 حركة ebp، esp
12 فرعية خاصة، 12 13 دفع ebx 14 ادفع esi 15 إصدار دفع
2021 cmp DWORD PTR _a$[ebp]، 1722 } (17 25 :a = a - b :6 !jg $L28 2324
12 فرعية خاصة، 12 13 دفع ebx 14 ادفع esi 15 إصدار دفع https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-40.jpg?height=36&width=747&top_left_y=720&top_left_x=607 2021 cmp DWORD PTR _a$[ebp]، 1722 } (17 25 :a = a - b :6 !jg $L28 2324| 12 فرعية خاصة، 12 13 دفع ebx 14 ادفع esi 15 إصدار دفع | | :--- | | ![](https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-40.jpg?height=36&width=747&top_left_y=720&top_left_x=607) 2021 cmp DWORD PTR _a$[ebp]، 1722 } (17 25 :a = a - b :6 !jg $L28 2324 |
10 دفعات ebp 11 حركة ebp، esp "12 فرعية خاصة، 12 13 دفع ebx 14 ادفع esi 15 إصدار دفع https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-40.jpg?height=36&width=747&top_left_y=720&top_left_x=607 2021 cmp DWORD PTR _a$[ebp]، 1722 } (17 25 :a = a - b :6 !jg $L28 2324" | 10 دفعات ebp 11 حركة ebp، esp | | :--- | | 12 فرعية خاصة، 12 13 دفع ebx 14 ادفع esi 15 إصدار دفع <br> ![](https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-40.jpg?height=36&width=747&top_left_y=720&top_left_x=607) 2021 cmp DWORD PTR _a$[ebp]، 1722 } (17 25 :a = a - b :6 !jg $L28 2324 | | |
xor eax، eax 26
sub eax، DWORD PTR _b$[ebp] 27
28 سلييًا
29 فرعي 3130 ؛ 7 DWORD PTR _a$[ebp]، eax :8 ؛inc DWORD PTR _c$[ebp] 34353332 !++c
ب = :9؛jmp $L29 38 $L28: 39403736 } وإلا 40 {
mov eax، DWORD PTR_a$[ebp] 43 mov 4241 !a DWORD PTR b$[ebp]، eax 44
45 ؛ 10 : + = : 45 
4 6
mov eax، DWORD PTR _b$[ebp] 47
DWORD PTR :_c$[ebp]، eax حركة
:L29$ 49
50 دولارًا أمريكيًا لـ24:
51
PUBLIC _main
_TEXT SEGMENT
_a$ = -4
_b$ = -8
_c$ = -12
_main PROC NEAR
; 2 : {
    push ebp
    mov ebp, esp
    sub esp, 12
    push ebx
    push esi
    push edi
$L29:
; 3 : int a, b, c;
;
; 5 : while (a <= 17) {
    cmp DWORD PTR _a$[ebp], 17
    jg $L30
; 6 : a = a - b;
    xor eax, eax
    sub eax, DWORD PTR _b$[ebp]
    neg eax
    sub DWORD PTR _a$[ebp], eax
; 7 : c++;
    inc DWORD PTR _c$[ebp]
; 8 : }
jmp $L29
$L30:
$L24:
; 9 : }
1 عام _ رئيسي
2 _قطعة نصية
4- = \$i_3
8- = \$ب_ 4
\(c \$=-12 \_5\)
6 _ الإجراء الرئيسي القريب
7
\} : 2 ; 8
9
10 دفعات ebp
11 حركة ebp، esp
12 فرعية خاصة، 12
13 دفع ebx
14 ادفع esi
15 إصدار دفع
:L29\$ 16
a <=) : 19 ؛ 19 : 18 17
    2122 cmp DWORD PTR _a\$[ebp]، 1723 \} (17
        26 :a = a - b :6 !jg \$L30 2425
xor eax، eax 27
28 فرعي [eax، DWORD PTR _b$[ebp] 29 سلبي
:7 ؛DWORD PTR _a$[ebp]، eax 313232 فرعي 31
؛DWORD PTR _c$[ebp] 35363634 بما في ذلك 34 +c jmp $L29 39 $L30: 40 $L24 3837 { :8
41
{ : 9 ; 42
PUBLIC _main
_TEXT SEGMENT
_a$ = -4
_b$ = -8
_c$ = -12
_main PROC NEAR
; 2 : {
    push ebp
    mov ebp, esp
    sub esp, 12
    push ebx
    push esi
    push edi
$L28:
; 3 : int a, b, c;
; 4 :
; 5 : do {
; 6 : a = a - b;
    xor eax, eax
    sub eax, DWORD PTR _b$[ebp]
    neg eax
    sub DWORD PTR _a$[ebp], eax
; 7 : c++;
    inc DWORD PTR _c$[ebp]
$L29:
; 8 : } while (a <= 17);
    cmp DWORD PTR _a$[ebp], 17
    jle $L28
$L30:
$L24:
; 9 : }
pop edi
pop esi
pop ebx
leave
1 عام _ رئيسي
2 _قطعة نصية
4- = \$ _ 3
\(8-=\$\) _ 4
\(c \$=-12 \_5\)
6 _ الإجراء الرئيسي القريب
7
\}: 2 ; 8
9
10 دفعات ebp
11 حركة ebp، esp
12 فرعية خاصة، 12
13 دفع ebx
14 ادفع esi
15 إصدار دفع
:L28\$ 16
17
؛int a، b، c :3 18
: 4 ; 19
20 ؛ 5 : افعل \}
21
22
xor eax، eax 23
24 فرعي [eax، DWORD PTR _b\$[ebp]
25 سلييًا
:7 ؛DWORD PTR _a\$[ebp]، eax 27 فرعي 28 : 26
DWORD PTR _c\$[ebp] 31 30 29 بما في ذلك 29 (c\$

DWORD PTR _a$[ebp]، سم 17 سم
36 جيل $28$
37 دولارًا أمريكيًا لـ30:
:L24$38
39
{ : 9 ; 40
41
42 إصدارًا شعييًا
43 بوب إيسي
44 بوب إي بي إكس
45 إجازة
; expr3 { 1 PUBLIC _main
2 _TEXT SEGMENT
3 _a$ = -4
4 _b$ = -8
5 _c$ = -12
6 _i$ = -16
7 _main PROC NEAR
8
9 ; 3 : {
10
11 push ebp
12 mov ebp, esp
13 sub esp, 16
14 push ebx
15 push esi
16 push edi
17
18 ;4: أنت أ، ب، ج؛
lse 19 ; 5 : int i;
20 ; 6 :
21 ; 7 : for (i = 1; i <= 17; ++i) {
22
23 mov DWORD PTR _i$[ebp], 1
24 jmp $L29
25 ل30:
26 inc DWORD PTR _i$[ebp]
27 ل29:
28 cmp DWORD PTR _i$[ebp], 17
29 jg $L31
30
31 ; 8 : a = a - b;
32
33 xor eax, eax
34 sub eax, DWORD PTR _b$[ebp]
35 neg eax
36 sub DWORD PTR _a$[ebp], eax
37
<= 17; i++) { 38 ; 9 : c++;
39
40 inc DWORD PTR _c$[ebp]
41
42 ; 10 : }
; expr3 { 1 PUBLIC _main 2 _TEXT SEGMENT 3 _a$ = -4 4 _b$ = -8 5 _c$ = -12 6 _i$ = -16 7 _main PROC NEAR 8 9 ; 3 : { 10 11 push ebp 12 mov ebp, esp 13 sub esp, 16 14 push ebx 15 push esi 16 push edi 17 18 ; 4 : int a, b, c; lse 19 ; 5 : int i; 20 ; 6 : 21 ; 7 : for (i = 1; i <= 17; ++i) { 22 23 mov DWORD PTR _i$[ebp], 1 24 jmp $L29 25 $L30: 26 inc DWORD PTR _i$[ebp] 27 $L29: 28 cmp DWORD PTR _i$[ebp], 17 29 jg $L31 30 31 ; 8 : a = a - b; 32 33 xor eax, eax 34 sub eax, DWORD PTR _b$[ebp] 35 neg eax 36 sub DWORD PTR _a$[ebp], eax 37 <= 17; i++) { 38 ; 9 : c++; 39 40 inc DWORD PTR _c$[ebp] 41 42 ; 10 : }| ; expr3 { | 1 | PUBLIC _main | | :--- | :--- | :--- | | | 2 | _TEXT SEGMENT | | | 3 | _a$ = -4 | | | 4 | _b$ = -8 | | | 5 | _c$ = -12 | | | 6 | _i$ = -16 | | | 7 | _main PROC NEAR | | | 8 | | | | 9 | ; 3 : { | | | 10 | | | | 11 | push ebp | | | 12 | mov ebp, esp | | | 13 | sub esp, 16 | | | 14 | push ebx | | | 15 | push esi | | | 16 | push edi | | | 17 | | | | 18 | ; 4 : int a, b, c; | | lse | 19 | ; 5 : int i; | | | 20 | ; 6 : | | | 21 | ; 7 : for (i = 1; i <= 17; ++i) { | | | 22 | | | | 23 | mov DWORD PTR _i$[ebp], 1 | | | 24 | jmp $L29 | | | 25 | $L30: | | | 26 | inc DWORD PTR _i$[ebp] | | | 27 | $L29: | | | 28 | cmp DWORD PTR _i$[ebp], 17 | | | 29 | jg $L31 | | | 30 | | | | 31 | ; 8 : a = a - b; | | | 32 | | | | 33 | xor eax, eax | | | 34 | sub eax, DWORD PTR _b$[ebp] | | | 35 | neg eax | | | 36 | sub DWORD PTR _a$[ebp], eax | | | 37 | | | <= 17; i++) { | 38 | ; 9 : c++; | | | 39 | | | | 40 | inc DWORD PTR _c$[ebp] | | | 41 | | | | 42 | ; 10 : } |
1 عام _ رئيسي
2
4 = $ 4 = $ 4-=$4-=\$ _ 3
pr2 @expr1) ل 8- = $ب_ 4
7 _ الإجراء الرئيسي القريب
8
} : 3 ; 9
10
11 دفع ebp
12 حركة: EBP، وخاصة
13 فرعية خاصة، 16
14 دفع ebx
15 دفع 16 esi
16 إصدار دفع
17
خطأ شني أنت أ، ب، ج:4 18
التركيب i : 5 : 19
: 6 ; 20
23 حركة 1 DWORD PTR :_i$[ebp]،
24 جمب $L29$
25 دولارًا أمريكيًا لـ30:
26 بوصة DWORD PTR _i$[ebp]
:L29$ 27
DWORD PTR _i$[ebp]، 17 سم 17
29 جول $L31
30
31
32
xor eax، eax 33
34 فرعي [8x]
35 سلبيًا
بالنسبة إلى ( 1 = 1 { :10
{ { } - ب؛ ج+
1 عام _ رئيسي 2 4-=$ _ 3 pr2 @expr1) ل 8- = $ب_ 4 7 _ الإجراء الرئيسي القريب 8 } : 3 ; 9 10 11 دفع ebp 12 حركة: EBP، وخاصة 13 فرعية خاصة، 16 14 دفع ebx 15 دفع 16 esi 16 إصدار دفع 17 خطأ شني int a، b، c :4 18 sint i : 5 : 19 : 6 ; 20 https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-46.jpg?height=40&width=704&top_left_y=1457&top_left_x=824 23 حركة 1 DWORD PTR :_i$[ebp]، 24 جمب $L29$ 25 دولارًا أمريكيًا لـ30: 26 بوصة DWORD PTR _i$[ebp] :L29$ 27 DWORD PTR _i$[ebp]، 17 سم 17 29 جول $L31 30 31 32 xor eax، eax 33 34 فرعي [8x] 35 سلبيًا https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-46.jpg?height=87&width=780&top_left_y=2215&top_left_x=596 بالنسبة إلى ( 1 = 1 { :10 { { } - ب؛ ج+ | 1 عام _ رئيسي | | | :--- | :--- | | | 2 | | | $4-=\$$ _ 3 | | pr2 @expr1) ل | 8- = $ب_ 4 | | | 7 _ الإجراء الرئيسي القريب | | | 8 | | | } : 3 ; 9 | | | 10 | | | 11 دفع ebp | | | 12 حركة: EBP، وخاصة | | | 13 فرعية خاصة، 16 | | | 14 دفع ebx | | | 15 دفع 16 esi | | | 16 إصدار دفع | | | 17 | | خطأ شني | int a، b، c :4 18 | | | sint i : 5 : 19 | | | : 6 ; 20 | | | ![](https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-46.jpg?height=40&width=704&top_left_y=1457&top_left_x=824) | | | 23 حركة 1 DWORD PTR :_i$[ebp]، | | | 24 جمب $L29$ | | | 25 دولارًا أمريكيًا لـ30: | | | 26 بوصة DWORD PTR _i$[ebp] | | | :L29$ 27 | | | DWORD PTR _i$[ebp]، 17 سم 17 | | | 29 جول $L31 | | | 30 | | | 31 | | | 32 | | | xor eax، eax 33 | | | 34 فرعي [8x] | | | 35 سلبيًا | | | ![](https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-46.jpg?height=87&width=780&top_left_y=2215&top_left_x=596) | | | | | بالنسبة إلى ( 1 = 1 | { :10 | | { { } - ب؛ ج+ | |
5 _main PROC NEAR
6
7 ; 2 : {
8
9 يدفع إي بي بي
10 موف ebp، خصوصًا
11 فرعي خصوصًا 12
12 يدفع إي بي إكس
13 يدفع إيسي
14 يدفع إيدي
15
16 ; 3 : int i؛
17 ; 4 : أنت؛
18 ; 5 :
19 ; 6 التبديل(i) {
20
21 موف eax، DWORD PTR _i$[ebp]
22 موف DWORD PTR -12+[ebp]، eax
تم إعادة تنفيذها بشكل مختلف 23 جمب ل27
عدد الفروع (حالة هيكل الحالة. 24 ل31:
25
على سبيل المثال، عدد 26 ; 7 : الحالة 1: j = 1؛ كسر؛
ويقوم المترجم بوضع الاختبار 27
مثبت عند -12[ebp] ويستخدم se- 28 موف DWORD PTR _j$[ebp]، 1
تصريحات الحكم. 29 جمب ل28
كسر؛ كسر؛ كسر؛ في T
break; break; break; in T| break; break; break; | | :--- | | in | | T |
30 $L32:
31
32 ; 8 : الحالة 2: j = 2؛ كسر؛
33
34 موف DWORD PTR _j$[ebp]، 2
35 جمب ل28
36 ل33:
37
38 ; 9 : الحالة 3: ج = 3؛ كسر؛
39
40 موف DWORD PTR _j$[ebp]، 3
41 جمب ل28
42 $L34:
43
44 ; 10 : افتراضيًا: j = 4؛
45
46 موف DWORD PTR _j$[ebp]، 4
47
48 ; 11 : }
49
5 _main PROC NEAR 6 7 ; 2 : { 8 9 push ebp 10 mov ebp, esp 11 sub esp, 12 12 push ebx 13 push esi 14 push edi 15 16 ; 3 : int i; 17 ; 4 : int j; 18 ; 5 : 19 ; 6 switch(i) { 20 21 mov eax, DWORD PTR _i$[ebp] 22 mov DWORD PTR -12+[ebp], eax re implemented differently de- 23 jmp $L27 mber of branches (case statestructure. 24 $L31: 25 g example, the number of 26 ; 7 : case 1: j = 1; break; nd the compiler puts the test 27 tack at -12[ebp] and uses a se- 28 mov DWORD PTR _j$[ebp], 1 ump statements. 29 jmp $L28 "break; break; break; in T" 30 $L32: 31 32 ; 8 : case 2: j = 2; break; 33 34 mov DWORD PTR _j$[ebp], 2 35 jmp $L28 36 $L33: 37 38 ; 9 : case 3: j = 3; break; 39 40 mov DWORD PTR _j$[ebp], 3 41 jmp $L28 42 $L34: 43 44 ; 10 : default: j = 4; 45 46 mov DWORD PTR _j$[ebp], 4 47 48 ; 11 : } 49 | | 5 | _main PROC NEAR | | | | :--- | :--- | :--- | :--- | :--- | | | 6 | | | | | | 7 | ; 2 | | : { | | | 8 | | | | | | 9 | push | | ebp | | | 10 | mov | | ebp, esp | | | 11 | sub | | esp, 12 | | | 12 | | push | ebx | | | 13 | | push | esi | | | 14 | | push | edi | | | 15 | | | | | | 16 | ; 3 | : | int i; | | | 17 | ; 4 | : | int j; | | | 18 | ; 5 | : | | | | 19 | ; 6 | | switch(i) { | | | 20 | | | | | | 21 | mov | | eax, DWORD PTR _i$[ebp] | | | 22 | mov | | DWORD PTR -12+[ebp], eax | | re implemented differently de- | 23 | jmp | | $L27 | | mber of branches (case statestructure. | 24 | $L31: | | | | | 25 | | | | | g example, the number of | 26 | ; 7 | : | case 1: j = 1; break; | | nd the compiler puts the test | 27 | | | | | tack at -12[ebp] and uses a se- | 28 | mov | | DWORD PTR _j$[ebp], 1 | | ump statements. | 29 | jmp | | $L28 | | break; break; break; <br> in <br> T | 30 | $L32: | | | | | 31 | | | | | | 32 | ; 8 | : | case 2: j = 2; break; | | | 33 | | | | | | 34 | mov | | DWORD PTR _j$[ebp], 2 | | | 35 | jmp | | $L28 | | | 36 | $L33: | | | | | 37 | | | | | | 38 | ; 9 | : | case 3: j = 3; break; | | | 39 | | | | | | 40 | mov | | DWORD PTR _j$[ebp], 3 | | | 41 | jmp | | $L28 | | | 42 | $L34: | | | | | 43 | | | | | | 44 | ; 10 | : | default: j = 4; | | | 45 | | | | | | 46 | mov | | DWORD PTR _j$[ebp], 4 | | | 47 | | | | | | 48 | ; 11 | : | } | | | 49 | | | |
5 _ الإجراء الرئيسي القريب 
6
} : 2;7
8
9 دفع ebp 
mov ebp، esp 10
11 فرعية خاصة، 12 xx 
12 دفع ebx
13 ادفع esi
14 إصدار دفع
15
{int i : 3 ؛ 16
{int j : 4 ؛ 17
: 5 ; 18
19؛ 6 \} : التبديل (i) 20
mov eax، DWORD PTR _i\$[ebp] 21
22 حركة DWORD PTR :-12+[ebp]، eax
:L31\$ 24
 المكدس عند -j\$[ebp]، 129 jmp \$L28 30 \$L32: 3132
mov DWORD PTR _j\$[ebp]، 23433 فاصل؛ 33 = 2 : 2
mov DWORD PTR _j\$[ebp]، 341 jmp \$L28 4039 فاصل؛ mov 4645 : 10: 10: 42: 42 \$L34: 43 49 \{ :11 !DWORD PTR _j\$[ebp]، 44748
يتم تنفيذ 23 جم L27$ عبارات البديلة بشكل مختلف على مختلف المستويات
RD PTR 12 + [ ebp ] , 1 12 + [ ebp ] , 1 -12+[ebp],1-12+[\mathrm{ebp}], 1
RD PTR 12 + [ ebp ] , 2 12 + [ ebp ] , 2 -12+[ebp],2-12+[\mathrm{ebp}], 2
RD PTR 12 + [ ebp ] , 3 12 + [ ebp ] , 3 -12+[ebp],3-12+[\mathrm{ebp}], 3
xample، الذي يحتوي على بضعة جداول انتقال nple إضافية لتحديد e. يملأ هذا الكود أيضًا مساحة من pp] إلى -13 [ebp] بـ cccccc بالتناوب. لا أعرف لماذا يبدو أن هذا يُنجز أي شيء.
}
}
العامة _ الرئيسية
;COMDAT _main
_قطعة نصية
_i$ = -4
j $ = 8 j $ = 8 _(-)j^($)=-8{ }_{-} \mathrm{j}^{\$}=-8
_main PROC NEAR
; 2 : {
دفع ebp
mov ebp، esp
فرعية خاصة، 76
ادفع ebx
ادفع إيسي
دفع تحرير
ليا إيدي، DWORD PTR [ebp-76]
موف إي سي إكس، 19
mov eax، -858993460؛ cccccccc C
ممثل توقف
;3 : int i؛
; 4 : int j j jj;
; 6 : switch(i) {
mov eax، DWORD PTR _i$[ebp]
mov DWORD PTR -12+[ebp]، eax
mov ecx، DWORD PTR -12+[ebp]
فرعي ecx، 1
mov DWORD PTR -12+[ebp]، ecx
cmp DWORD PTR -12+[ebp]، 7
جا قصير $L44
mov edx، DWORD PTR -12+[ebp]
jmp DWORD PTR $L49[edx*4]
$L37:
; 7 : الحالة 1: j = 1؛ كسر؛
1 عام _ رئيسي
COMDAT _main ! 2
3 _قطعة نصية
i\$ = -4_4
8- = \$r_5
6 _ الإجراء الرئيسي القريب
7
\} : 2 ; 8
9
10 دفعات ebp
11 حركة ebp، esp
12 فرعية خاصة، 76
13 دفع ebx
14 ادفع esi
15 دفع النسخة 71 النهائية. المثال التالي، الذي يحتوي على بـ
16
17 فيلمًا ecx و19 جاحة من المكد من -ebp[76] إلى -13

19 مستحيلًا ثابتًا.
20
فاي
؛int i : 3 ؛ 21
;int j : 4 ; 22
: 5 ; 23
24؛ 6: التبديل (ط) 25 )
26 حركة [ 26 [eax، DWORD PTR _i$p
ecx، 29 فرعي 1
DWORD PTR -12+[ebp]، ecx 30 حركة
} switch(i)
استراحة

ريك i j = 6 i j = 6 ij=6\mathfrak{i j}=6
DWORD PTR -12+[ebp]، 31 سم مكعب 7
32 جا قصير 441 دولارًا
mov edx، DWORD PTR -12+[ebp] 33
jmp DWORD PTR $L49[edx*4] 34
:L37$ 35
36 37؛ 7: الحالة 1: 1 = 1 ؛ فاصل؛ 38 37 38 mov DWORD PTR _j$[ebp]، 1
IORT $L34 85
86 pop إيدي
87 pop إيسي
case 3: j = 3; break; 88 pop إي بي إكس
89 موف esp, ebp
ORD PTR _j$[ebp], 3 90 pop إي بي بي
IORT $L34 91 ret 0
92 ل49:
93 DD $L37 ; case 1
case 8: j = 8; break; 94 DD $L41 ; case 2
95 DD $L38 ; case 3
ORD PTR _j$[ebp], 8
IORT $L34
ORD PTR _j$[ebp], 8 IORT $L34| ORD PTR _j$[ebp], 8 | | :--- | | IORT $L34 |
96 DD $L43 ; case 4
97 DD $L44 ; case 5 - default
98 DD $L40 ; case 6
99 DD $L42 ; case 7
case 6: j = 6; break; 100 DD $L39 ; case 8
101 _main ENDP
ORD PTR _j$[ebp], 6 102 _TEXT ENDS
IORT $L34 103 END
IORT $L34 85 86 pop edi 87 pop esi case 3: j = 3; break; 88 pop ebx 89 mov esp, ebp ORD PTR _j$[ebp], 3 90 pop ebp IORT $L34 91 ret 0 92 $L49: 93 DD $L37 ; case 1 case 8: j = 8; break; 94 DD $L41 ; case 2 95 DD $L38 ; case 3 "ORD PTR _j$[ebp], 8 IORT $L34" 96 DD $L43 ; case 4 97 DD $L44 ; case 5 - default 98 DD $L40 ; case 6 99 DD $L42 ; case 7 case 6: j = 6; break; 100 DD $L39 ; case 8 101 _main ENDP ORD PTR _j$[ebp], 6 102 _TEXT ENDS IORT $L34 103 END | IORT $L34 | 85 | | | | | | :--- | :--- | :--- | :--- | :--- | :--- | | | 86 | pop | edi | | | | | 87 | pop | esi | | | | case 3: j = 3; break; | 88 | pop | ebx | | | | | 89 | mov | | esp, ebp | | | ORD PTR _j$[ebp], 3 | 90 | pop | ebp | | | | IORT $L34 | 91 | ret | 0 | | | | | 92 | $L49: | | | | | | 93 | DD $L37 ; case 1 | | | | | case 8: j = 8; break; | 94 | DD $L41 ; case 2 | | | | | | 95 | | DD $L38 | ; case 3 | | | ORD PTR _j$[ebp], 8 <br> IORT $L34 | 96 | | DD $L43 | ; case 4 | | | | 97 | | DD $L44 | | ; case 5 - default | | | 98 | | DD $L40 | ; case 6 | | | | 99 | | DD $L42 | ; case 7 | | | case 6: j = 6; break; | 100 | DD $L39 ; case 8 | | | | | | 101 | _main ENDP | | | | | ORD PTR _j$[ebp], 6 | 102 | _TEXT ENDS | | | | | IORT $L34 | 103 | END | | | |
ORD PTR _j$[ebp], 2 IORT $L34 In the next example, the values in the the case statements are not are not close together, so the compiler uses a two stage jump table. One table hold an index into the second table which lists the location to jump to.
case 7: j = 7; break;
int main()
{
int main() {| int main() | | :--- | | { |
case 4: j = 4; break;
switch(i) {
case 10: j = 1; break;
case 33: j = 3; break;
case 85: j = 8; break;
switch(i) { case 10: j = 1; break; case 33: j = 3; break; case 85: j = 8; break;| switch(i) { | | :--- | | case 10: j = 1; break; | | case 33: j = 3; break; | | case 85: j = 8; break; |
ORD PTR _j$[ebp], 4 IORT $L34
case 66: j = 6; break;
case 20: j = 2; break;
case 79: j = 7; break;
case 41: j = 4; break;
default: j = 9; break;
}
case 66: j = 6; break; case 20: j = 2; break; case 79: j = 7; break; case 41: j = 4; break; default: j = 9; break; }| case 66: j = 6; break; | | :--- | | case 20: j = 2; break; | | case 79: j = 7; break; | | case 41: j = 4; break; | | default: j = 9; break; | | } |
ORD PTR _j$[ebp], 9 }
ORD PTR _j$[ebp], 2 IORT $L34 In the next example, the values in the the case statements are not are not close together, so the compiler uses a two stage jump table. One table hold an index into the second table which lists the location to jump to. case 7: j = 7; break; "int main() {" case 4: j = 4; break; "switch(i) { case 10: j = 1; break; case 33: j = 3; break; case 85: j = 8; break;" ORD PTR _j$[ebp], 4 IORT $L34 "case 66: j = 6; break; case 20: j = 2; break; case 79: j = 7; break; case 41: j = 4; break; default: j = 9; break; }" ORD PTR _j$[ebp], 9 }| ORD PTR _j$[ebp], 2 IORT $L34 | In the next example, the values in the the case statements are not are not close together, so the compiler uses a two stage jump table. One table hold an index into the second table which lists the location to jump to. | | :--- | :--- | | | | | case 7: j = 7; break; | int main() <br> { | | | | | | | | case 4: j = 4; break; | switch(i) { <br> case 10: j = 1; break; <br> case 33: j = 3; break; <br> case 85: j = 8; break; | | ORD PTR _j$[ebp], 4 IORT $L34 | case 66: j = 6; break; <br> case 20: j = 2; break; <br> case 79: j = 7; break; <br> case 41: j = 4; break; <br> default: j = 9; break; <br> } | | ORD PTR _j$[ebp], 9 | } |
85
86 إصدارًا شعييًا
9 82 $L34: 83
88 بوب إي بي إكس
89 حركة خاصة، إي بي بي
90 نقطة في البوصة
ret 091
:L49$ 92
1: DD $L37 93
الحالة DD $L41 94
35 DD $L38 95
46
DD $L44 97
98 98
7 DD $L42 99
10010
ENDP الرئيسية 101
102 _نهاية النص
في المثال التالي، القيم في عبارات الحالة ليست متقاربة، لذا يستخدم المُجمِّع
جدول انتقال من مرحلتين. يحتوي أحد الجدولين على فهرس في الجدول الثاني الذي يُدرج الموقع للانتقال إليه.
()int main
}
؛int i
أنت
؛ 3 = 1 : الحالة 10 } switch(i)
؛break ؛ (break = 3 ؛ 33 ؛ 33 ؛ 3 ؛ 3 ؛ 3 ؛ الحالة 85: break 8 ؛ 8 ؛ 8 ؛ 8 ؛ 93
؛break " 2
؛break ؛ (j = 4 ؛ 41 ؛ 4 ؛ 4 ؛ 4 ؛ 4 ؛ 4 ؛
الافتراضي: break ؛ 9 ؛ 9 ؛ 9
ain 46
main 47 موف DWORD PTR _j$[ebp], 3
NT 48 jmp SHORT $L34
49 ل39:
50
NEAR 51 ; 9 case 85: j = 8; break;
52
53 موف DWORD PTR _j$[ebp], 8
54 jmp SHORT $L34
p 55 ل40:
p, esp 56
p, 76 57 ; 10 case 66: j = 6; break;
x 58
i 59 موف DWORD PTR _j$[ebp], 6
لي 60 jmp SHORT $L34
li, DWORD PTR [ebp-76] 61 ل41:
:x, 19 62
x, -858993460 ; cccccccch 63 ; 11 case 20: j = 2; break;
d 64
65 موف DWORD PTR _j$[ebp], 2
int i؛ 66 jmp SHORT $L34
أنت؛ 67 ل42:
68
التبديل(i) { 69 ; 12 case 79: j = 7; break;
70
x, DWORD PTR _i$[ebp] 71 موف DWORD PTR _j$[ebp], 7
ORD PTR -12+[ebp], eax 72 jmp SHORT $L34
:x, DWORD PTR -12+[ebp] 73 ل43:
x, 10 74
ORD PTR -12+[ebp], ecx 75 ; 13 case 41: j = 4; break;
ORD PTR -12+[ebp], 75 76
ل44 77 موف DWORD PTR _j$[ebp], 4
x, DWORD PTR -12+[ebp] 78 jmp SHORT $L34
x, edx 79 ل44:
, BYTE PTR $L49 [eax] 80
ORD PTR $L50[edx*4] 81 ; 14 default: j = 9; break;
82
83 موف DWORD PTR _j$[ebp], 9
case 10: j = 1; break; 84 $L34:
85
ORD PTR _j$[ebp], 1 86 ; 16 }
IORT $L34 87
88 pop إيدي
89 pop إيسي
case 33: j = 3; break; 90 pop إي بي إكس
ain 46 main 47 mov DWORD PTR _j$[ebp], 3 NT 48 jmp SHORT $L34 49 $L39: 50 NEAR 51 ; 9 case 85: j = 8; break; 52 53 mov DWORD PTR _j$[ebp], 8 54 jmp SHORT $L34 p 55 $L40: p, esp 56 p, 76 57 ; 10 case 66: j = 6; break; x 58 i 59 mov DWORD PTR _j$[ebp], 6 li 60 jmp SHORT $L34 li, DWORD PTR [ebp-76] 61 $L41: :x, 19 62 x, -858993460 ; cccccccch 63 ; 11 case 20: j = 2; break; d 64 65 mov DWORD PTR _j$[ebp], 2 int i; 66 jmp SHORT $L34 int j; 67 $L42: 68 switch(i) { 69 ; 12 case 79: j = 7; break; 70 x, DWORD PTR _i$[ebp] 71 mov DWORD PTR _j$[ebp], 7 ORD PTR -12+[ebp], eax 72 jmp SHORT $L34 :x, DWORD PTR -12+[ebp] 73 $L43: x, 10 74 ORD PTR -12+[ebp], ecx 75 ; 13 case 41: j = 4; break; ORD PTR -12+[ebp], 75 76 $L44 77 mov DWORD PTR _j$[ebp], 4 x, DWORD PTR -12+[ebp] 78 jmp SHORT $L34 x, edx 79 $L44: , BYTE PTR $L49 [eax] 80 ORD PTR $L50[edx*4] 81 ; 14 default: j = 9; break; 82 83 mov DWORD PTR _j$[ebp], 9 case 10: j = 1; break; 84 $L34: 85 ORD PTR _j$[ebp], 1 86 ; 16 } IORT $L34 87 88 pop edi 89 pop esi case 33: j = 3; break; 90 pop ebx| ain | 46 | | | | :--- | :--- | :--- | :--- | | main | 47 | mov | DWORD PTR _j$[ebp], 3 | | NT | 48 | jmp | SHORT $L34 | | | 49 | $L39: | | | | 50 | | | | NEAR | 51 | ; 9 | case 85: j = 8; break; | | | 52 | | | | | 53 | mov | DWORD PTR _j$[ebp], 8 | | | 54 | jmp | SHORT $L34 | | p | 55 | $L40: | | | p, esp | 56 | | | | p, 76 | 57 | ; 10 | case 66: j = 6; break; | | x | 58 | | | | i | 59 | mov | DWORD PTR _j$[ebp], 6 | | li | 60 | jmp | SHORT $L34 | | li, DWORD PTR [ebp-76] | 61 | $L41: | | | :x, 19 | 62 | | | | x, -858993460 ; cccccccch | 63 | ; 11 | case 20: j = 2; break; | | d | 64 | | | | | 65 | mov | DWORD PTR _j$[ebp], 2 | | int i; | 66 | jmp | SHORT $L34 | | int j; | 67 | $L42: | | | | 68 | | | | switch(i) { | 69 | ; 12 | case 79: j = 7; break; | | | 70 | | | | x, DWORD PTR _i$[ebp] | 71 | mov | DWORD PTR _j$[ebp], 7 | | ORD PTR -12+[ebp], eax | 72 | jmp | SHORT $L34 | | :x, DWORD PTR -12+[ebp] | 73 | $L43: | | | x, 10 | 74 | | | | ORD PTR -12+[ebp], ecx | 75 | ; 13 | case 41: j = 4; break; | | ORD PTR -12+[ebp], 75 | 76 | | | | $L44 | 77 | mov | DWORD PTR _j$[ebp], 4 | | x, DWORD PTR -12+[ebp] | 78 | jmp | SHORT $L34 | | x, edx | 79 | $L44: | | | , BYTE PTR $L49 [eax] | 80 | | | | ORD PTR $L50[edx*4] | 81 | ; 14 | default: j = 9; break; | | | 82 | | | | | 83 | mov | DWORD PTR _j$[ebp], 9 | | case 10: j = 1; break; | 84 | $L34: | | | | 85 | | | | ORD PTR _j$[ebp], 1 | 86 | ; 16 | } | | IORT $L34 | 87 | | | | | 88 | pop | edi | | | 89 | pop | esi | | case 33: j = 3; break; | 90 | pop | ebx |
47 حركة DWORD PTR _j$[ebp]، 3
L34$ قصير jmp 48
49 دولارًا أمريكيًا 393 :
موف PTR فاصل؛ = 8 :85 الحالة :9 ؛ 51
:10 8 jmp ل34 55 $ ل40: 56
موف PTR 59 4 فاصل = :66 6
j € 6 جمب ل34 61 $ 41: 62
موف PTR ebp] جمب 65 64 : !=
فاصل؛ 7 = 7 :79 <SHORT ل34 67 ل42: 68 69
mov DWORD _j 7 jmp SH HORT ل34 71
موف 7776 فاصل؛ :41 :13 <73 ل43: 74 75
DWORD PTR ج$ 78 SHO RT $ 79 $
موف PTR فَاص 9 خي بعد :14 80 يورو
بوب 87 ؛ j$[ebp] 9 84 $L34: 85
بوب إيسي
mov PTR فاصل؛ = 8 :85 الحالة :9 ؛ 51 :10 8 jmp $L34 55 $ L40: 56 mov PTR 59 4 فاصل = :66 6 j € 6 jmp $L34 61 $ 41: 62 mov PTR ebp] jmp 65 64 : != فاصل؛ 7 = 7 :79 <SHORT $L34 67 $L42: 68 69 mov DWORD _j 7 jmp SH HORT $L34 71 mov 7776 فاصل؛ :41 :13 <73 $L43: 74 75 DWORD PTR j$ 78 SHO RT $ 79 $ mov PTR فاص 9 خي افتر :14 €80 pop 87 ؛ j$[ebp] 9 84 $L34: 85 pop esi| mov | PTR | فاصل؛ | = 8 | :85 | الحالة | :9 | ؛ 51 | | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | | :10 | 8 | jmp | $L34 | 55 | $ | L40: | 56 | | mov | PTR | 59 | 4 | فاصل | = | :66 | 6 | | j | € 6 | jmp | $L34 | 61 | $ | 41: | 62 | | mov | PTR | ebp] | jmp | 65 | 64 | : | != | | فاصل؛ 7 = 7 | :79 | <SHORT | $L34 | 67 | $L42: | 68 | 69 | | mov DWORD | _j | 7 | jmp | SH | HORT | $L34 | 71 | | mov 7776 | فاصل؛ | :41 | :13 | <73 | $L43: | 74 | 75 | | DWORD PTR | j$ | 78 | SHO | RT | $ | 79 | $ | | mov | PTR | فاص | 9 | خي | افتر | :14 | €80 | | pop | 87 | ؛ | j$[ebp] | 9 | 84 | $L34: | 85 | | | | | | | | pop | esi |
[bp-76] 16
18 جزء 93460
24؛ 6: مفتاح (i)
26 حركة ص]
30 حركة ecx
31 سم مكعب 75
33 حركة [bp
35 حركة للنت
dx*4] 36
DWORD PTR -12+[ebp]، eax à
ecx، DWORD PTR -12+[ebp]
mov DWORD PTR _j$[ebp]، 142 jmp SHORT $L34 43 $L38: 44
90 بوب إي بي إكس
ص، ب ب 136 قاعدة بيانات 7
137 قاعدة بيانات 7
138 قاعدة بيانات 7
139 قاعدة بيانات 7
؛ المدخل 0 - الحالة 10 140 قاعدة بيانات 7
؛ القضية 20 141 قاعدة بيانات 7
؛ القضية 33 142 قاعدة بيانات 7
؛ القضية 41 143 قاعدة بيانات 7
؛ القضية 66 144 قاعدة بيانات 7
؛ القضية 79 145 قاعدة بيانات 7
؛ القضية 85 146 قاعدة بيانات 7
؛ الإدخال 7، الافتراضي 147 قاعدة بيانات 7
148 قاعدة بيانات 7
0 149 قاعدة بيانات 7
150 قاعدة بيانات 7
151 قاعدة بيانات 7
152 قاعدة بيانات 7
153 قاعدة بيانات 7
154 قاعدة بيانات 7
155 قاعدة بيانات 7
156 قاعدة بيانات 7
157 قاعدة بيانات 7
158 قاعدة بيانات 7
20 159 قاعدة بيانات 7
160 قاعدة البيانات 4 ; 66
161 قاعدة بيانات 7
162 قاعدة بيانات 7
163 قاعدة بيانات 7
164 قاعدة بيانات 7
165 قاعدة بيانات 7
166 قاعدة بيانات 7
167 قاعدة بيانات 7
168 قاعدة بيانات 7
169 قاعدة بيانات 7
170 قاعدة بيانات 7
171 قاعدة بيانات 7
3 172 قاعدة بيانات 7
173 دي بي 5؛ 79
174 قاعدة بيانات 7
175 قاعدة بيانات 7
176 قاعدة بيانات 7
177 قاعدة بيانات 7
178 قاعدة بيانات 7
179 دي بي 6؛ 85
41 180 _الرئيسية ENDP
p, ebp 136 DB 7 137 DB 7 138 DB 7 139 DB 7 ; entry 0 - case 10 140 DB 7 ; case 20 141 DB 7 ; case 33 142 DB 7 ; case 41 143 DB 7 ; case 66 144 DB 7 ; case 79 145 DB 7 ; case 85 146 DB 7 ; entry 7, default 147 DB 7 148 DB 7 0 149 DB 7 150 DB 7 151 DB 7 152 DB 7 153 DB 7 154 DB 7 155 DB 7 156 DB 7 157 DB 7 158 DB 7 20 159 DB 7 160 DB 4 ; 66 161 DB 7 162 DB 7 163 DB 7 164 DB 7 165 DB 7 166 DB 7 167 DB 7 168 DB 7 169 DB 7 170 DB 7 171 DB 7 3 172 DB 7 173 DB 5 ; 79 174 DB 7 175 DB 7 176 DB 7 177 DB 7 178 DB 7 179 DB 6 ; 85 41 180 _main ENDP | p, ebp | 136 | DB 7 | | | :--- | :--- | :--- | :--- | | | 137 | DB 7 | | | | 138 | DB 7 | | | | 139 | DB 7 | | | ; entry 0 - case 10 | 140 | DB 7 | | | ; case 20 | 141 | DB 7 | | | ; case 33 | 142 | DB 7 | | | ; case 41 | 143 | DB 7 | | | ; case 66 | 144 | DB 7 | | | ; case 79 | 145 | DB 7 | | | ; case 85 | 146 | DB 7 | | | ; entry 7, default | 147 | DB 7 | | | | 148 | DB 7 | | | 0 | 149 | DB 7 | | | | 150 | DB 7 | | | | 151 | DB 7 | | | | 152 | DB 7 | | | | 153 | DB 7 | | | | 154 | DB 7 | | | | 155 | DB 7 | | | | 156 | DB 7 | | | | 157 | DB 7 | | | | 158 | DB 7 | | | 20 | 159 | DB 7 | | | | 160 | DB 4 | ; 66 | | | 161 | DB 7 | | | | 162 | DB 7 | | | | 163 | DB 7 | | | | 164 | DB 7 | | | | 165 | DB 7 | | | | 166 | DB 7 | | | | 167 | DB 7 | | | | 168 | DB 7 | | | | 169 | DB 7 | | | | 170 | DB 7 | | | | 171 | DB 7 | | | 3 | 172 | DB 7 | | | | 173 | DB 5 ; 79 | | | | 174 | DB 7 | | | | 175 | DB 7 | | | | 176 | DB 7 | | | | 177 | DB 7 | | | | 178 | DB 7 | | | | 179 | DB 6 ; 85 | | | 41 | 180 | _main ENDP | |
7 ديسييل 136
7 ديسييل 137
7
138
7 ديسييل
7 ديسيبل 140
7 ديزل 141
7 ديسييل 142
7 ديسييل 143
7 ديزل 144
7 ديسييل 145
7 ديسييل 146
7 ديسيل 147
7 ديسييل 148
7 ديسييل 149
7 ديسييل 150
7 ديسييل 151
7 ديسييل 152
7 ديسييل 153
7 ديسييل 154
7 ديسييل 155
7 ديسييل 156
7 ديسييل 157
7 ديسييل 158
7 ديسيل 159
66 €4 ديسيل 160
7 ديسييل 161
7 ديسييل 162
7 ديسييل 163
7 ديسييل 164
7 ديسييل 165
7 ديسييل 166
7 ديسييل 167
7 ديسييل 168
7 ديسييل 169
7 ديسييل 170
7 ديسييل 171
7 ديسييل 172
79 5 بي دي
7 ديسييل 174
7 ديسييل 175
7 ديسييل 176
7 دي بي 177
7 ديسييل 178
85 بي دي
EN NDP بية الرئيسب
7 ديسييل 136 7 ديسييل 137 7 https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-56.jpg?height=34&width=70&top_left_y=364&top_left_x=626 138 7 ديسييل 7 ديسيبل 140 7 ديسيل 141 7 ديسييل 142 7 ديسييل 143 7 ديسيل 144 7 ديسييل 145 7 ديسييل 146 7 ديسيل 147 7 ديسييل 148 7 ديسييل 149 7 ديسييل 150 7 ديسييل 151 7 ديسييل 152 7 ديسييل 153 7 ديسييل 154 7 ديسييل 155 7 ديسييل 156 7 ديسييل 157 7 ديسييل 158 7 ديسيل 159 66 €4 ديسيل 160 7 ديسييل 161 7 ديسييل 162 7 ديسييل 163 7 ديسييل 164 7 ديسييل 165 7 ديسييل 166 7 ديسييل 167 7 ديسييل 168 7 ديسييل 169 7 ديسييل 170 7 ديسييل 171 7 ديسييل 172 79 5 بي دي 7 ديسييل 174 7 ديسييل 175 7 ديسييل 176 7 دي بي 177 7 ديسييل 178 85 € بي دي EN NDP بية الرئيسب| 7 | ديسييل | 136 | | | :--- | :--- | :--- | :--- | | 7 | ديسييل | 137 | | | 7 | ![](https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-56.jpg?height=34&width=70&top_left_y=364&top_left_x=626) | 138 | | | 7 | ديسييل | | | | 7 | ديسيبل | 140 | | | 7 | ديسيل | 141 | | | 7 | ديسييل | 142 | | | 7 | ديسييل | 143 | | | 7 | ديسيل | 144 | | | 7 | ديسييل | 145 | | | 7 | ديسييل | 146 | | | 7 | ديسيل | 147 | | | 7 | ديسييل | 148 | | | 7 | ديسييل | 149 | | | 7 | ديسييل | 150 | | | 7 | ديسييل | 151 | | | 7 | ديسييل | 152 | | | 7 | ديسييل | 153 | | | 7 | ديسييل | 154 | | | 7 | ديسييل | 155 | | | 7 | ديسييل | 156 | | | 7 | ديسييل | 157 | | | 7 | ديسييل | 158 | | | 7 | ديسيل | 159 | | | 66 | €4 | ديسيل | 160 | | 7 | ديسييل | 161 | | | 7 | ديسييل | 162 | | | 7 | ديسييل | 163 | | | 7 | ديسييل | 164 | | | 7 | ديسييل | 165 | | | 7 | ديسييل | 166 | | | 7 | ديسييل | 167 | | | 7 | ديسييل | 168 | | | 7 | ديسييل | 169 | | | 7 | ديسييل | 170 | | | 7 | ديسييل | 171 | | | 7 | ديسييل | 172 | | | 79 | 5 | بي | دي | | 7 | ديسييل | 174 | | | 7 | ديسييل | 175 | | | 7 | ديسييل | 176 | | | 7 | دي بي | 177 | | | 7 | ديسييل | 178 | | | 85 | € | بي | دي | | EN | NDP | بية | الرئيسب |
17 ; 4 أنت أ، ب؛
18 ; 5 int i؛
19 ; 6 :
20 ; 7 :
21
22 موف DWORD PTR _i$[ebp], 1
23 jmp ل28
24 ل29:
25 inc DWORD PTR _i$[ebp]
26 $L28:
<= 17; i++) { 27 سمب DWORD PTR _i$[ebp]، 17
يكمل؛ 28 jg $L30
استراحة؛ 29
30 ; 8 إذا (a == 0) استمر؛
31
) { 32 سمب DWORD PTR _a$[ebp]، 0
يكمل؛ 33 جين ل31
استراحة؛ 34 جمب ل29
35 ل31:
36
37 ; 9 :
يكمل؛ 38
استراحة؛ 39 سمب DWORD PTR _b$ [ebp]، 0
17); 40 جين ل32
41 جمب ل30 دولارًا
42 $L32:
43
44 ; 10 : }
45
عين 46 جمب ل29
NT 47 ل30:
48 $L34:
49
50 ; 11 :
51 ; 12 :
52
53
54
53 cmp 54 jg $ L35 53  cmp  54  jg  $  L35  {:[53," cmp "],[54," jg "$" L35 "]:}\begin{array}{ll}53 & \text { cmp } \\ 54 & \text { jg } \$ \text { L35 }\end{array}
53 54 53, cmp, 54, jg $ L35| 53 | | :--- | | 54 | | $\begin{array}{ll}53 & \text { cmp } \\ 54 & \text { jg } \$ \text { L35 }\end{array}$ |
55
p 56 ; 13 :
ص، خاصة 57
ص 12
x 58 سمب DWORD PTR _a$[ebp]، 0
59 جين ل36
i 60 جمب ل34
61 ل36:
17 ; 4 int a, b; 18 ; 5 int i; 19 ; 6 : 20 ; 7 : 21 22 mov DWORD PTR _i$[ebp], 1 23 jmp $L28 24 $L29: 25 inc DWORD PTR _i$[ebp] 26 $L28: <= 17; i++) { 27 cmp DWORD PTR _i$[ebp], 17 continue; 28 jg $L30 break; 29 30 ; 8 if (a == 0) continue; 31 ) { 32 cmp DWORD PTR _a$[ebp], 0 continue; 33 jne $L31 break; 34 jmp $L29 35 $L31: 36 37 ; 9 : continue; 38 break; 39 cmp DWORD PTR _b$ [ebp], 0 17); 40 jne $L32 41 jmp $L30 42 $L32: 43 44 ; 10 : } 45 ain 46 jmp $L29 NT 47 $L30: 48 $L34: 49 50 ; 11 : 51 ; 12 : 52 "53 54 53, cmp, 54, jg $ L35" 55 p 56 ; 13 : p, esp 57 p, 12 x 58 cmp DWORD PTR _a$[ebp], 0 59 jne $L36 i 60 jmp $L34 61 $L36: | | 17 | ; 4 | int a, b; | | :--- | :--- | :--- | :--- | | | 18 | ; 5 | int i; | | | 19 | ; 6 | : | | | 20 | ; 7 | : | | | 21 | | | | | 22 | mov | DWORD PTR _i$[ebp], 1 | | | 23 | jmp | $L28 | | | 24 | $L29: | | | | 25 | inc | DWORD PTR _i$[ebp] | | | 26 | $L28: | | | <= 17; i++) { | 27 | cmp | DWORD PTR _i$[ebp], 17 | | continue; | 28 | jg $L30 | | | break; | 29 | | | | | 30 | ; 8 | if (a == 0) continue; | | | 31 | | | | ) { | 32 | cmp | DWORD PTR _a$[ebp], 0 | | continue; | 33 | jne | $L31 | | break; | 34 | jmp | $L29 | | | 35 | $L31: | | | | 36 | | | | | 37 | ; 9 | : | | continue; | 38 | | | | break; | 39 | cmp | DWORD PTR _b$ [ebp], 0 | | 17); | 40 | jne | $L32 | | | 41 | jmp | $L30 | | | 42 | $L32: | | | | 43 | | | | | 44 | ; 10 | : } | | | 45 | | | | ain | 46 | jmp | $L29 | | NT | 47 | $L30: | | | | 48 | $L34: | | | | 49 | | | | | 50 | ; 11 | : | | | 51 | ; 12 | : | | | 52 | | | | 53 <br> 54 <br> $\begin{array}{ll}53 & \text { cmp } \\ 54 & \text { jg } \$ \text { L35 }\end{array}$ | | | | | | | | | | | 55 | | | | p | 56 | ; 13 | : | | p, esp | 57 | | | | p, 12 | | | | | x | 58 | cmp | DWORD PTR _a$[ebp], 0 | | | 59 | jne | $L36 | | i | 60 | jmp | $L34 | | | 61 | $L36: | |
;int a, b : 4 ! 17
Int i: من 5 إلى 18
: 6 ; 19

22 حركة DWORD PTR _i$[ebp]، 1
23 يومًا L28
:L29$ 24
25 بوصة DWORD PTR _i$[ebp]
:L28$ 26
بالنسبة إلى (1 = 1؛ 17
)) تستمر؛ إذا (أ == 0)
DWORD PTR _i$[ebp]، 27 سم 17
28 يومًا 30 دولارًا
29.30 دولارًا 8: إذا (a == 0) يستمر؛ 31

(باسم)
0) أمير {
DWORD PTR _b\$[ebp]، 0 سم 0
40 جنيهًا إسترلينيًا L32
41 جمب L30\$
:L32\$ 42
43
\{ : 10 ; 44
45
46 جمب \$29
47 دولارًا أمريكيًا لـ30:
:L34\$ 48
49
5253 cmp DWORD PTR \} (i <=17) 50: 11: 11: 11: 51: 17
56 55
cmp DWORD PTR _a$[ebp]، 058
L36$ 59
60 آه 134 دولارًا
:L36$ 61
86
إذا (ب == 0) كسر؛ 87 سمب DWORD PTR _b$[ebp]، 0
88 جين ل42
ORD PTR _b$[ebp]، 0 89 جمب ل40
37 90 ل42:
35 91 $L39 :
92
93 ; 20 } بينما (i ​​<= 17)؛
} 94
95 سمب DWORD PTR _i$[ebp]، 17
34 96 أنا ل38
97 ل40:
98 ل24:
99
100 ; 21 }
يفعل { 101
إذا (a == 0) استمر؛ 102 بوب إيدي
103 بوب إيسي
ORD PTR _a$[ebp]، 0 104 بوب إي بي إكس
41 105 يترك
39 106 ret 0
107 _رئيسي ENDP
108 _TEXT ENDS
إذا (ب == 0) كسر؛ 109 END
86 if (b == 0) break; 87 cmp DWORD PTR _b$[ebp], 0 88 jne $L42 ORD PTR _b$[ebp], 0 89 jmp $L40 37 90 $L42: 35 91 $L39 : 92 93 ; 20 } while (i <= 17); } 94 95 cmp DWORD PTR _i$[ebp], 17 34 96 jle $L38 97 $L40: 98 $L24: 99 100 ; 21 } do { 101 if (a == 0) continue; 102 pop edi 103 pop esi ORD PTR _a$[ebp], 0 104 pop ebx 41 105 leave 39 106 ret 0 107 _main ENDP 108 _TEXT ENDS if (b == 0) break; 109 END | 86 | | | | | | :--- | :--- | :--- | :--- | :--- | | if (b == 0) break; | 87 | cmp | | DWORD PTR _b$[ebp], 0 | | | 88 | jne | $L42 | | | ORD PTR _b$[ebp], 0 | 89 | jmp | $L40 | | | 37 | 90 | $L42: | | | | 35 | 91 | $L39 : | | | | | 92 | | | | | | 93 | ; 20 | | } while (i <= 17); | | } | 94 | | | | | | 95 | cmp | | DWORD PTR _i$[ebp], 17 | | 34 | 96 | jle | $L38 | | | | 97 | $L40: | | | | | 98 | $L24: | | | | | 99 | | | | | | 100 | ; 21 | } | | | do { | 101 | | | | | if (a == 0) continue; | 102 | pop | edi | | | | 103 | pop | esi | | | ORD PTR _a$[ebp], 0 | 104 | pop | ebx | | | 41 | 105 | leave | | | | 39 | 106 | ret | 0 | | | | 107 | _main | ENDP | | | | 108 | _TEXT | ENDS | | | if (b == 0) break; | 109 | END | | |
nt الحسابية
وحدة حسابية، تُسمى وحدة النقطة العائمة (FPU)، تحتوي على ثمانية سجلات. يُشار إلى السجل الموجود حاليًا في أعلى المكدس باسم ST. تُحدد الهياكل المعاملات المتعلقة بـ ST.
62 63؛ 14: إذا (0 = 0) انكسر؛ 86
L42$ 88
65 سنة :L42$90
DWORD PTR _i$[ebp]، 95 سم 17 96 جيلي $188 97 غير أمريكيًا لـ40: :L24$ 98 99 { : 21 ; 100
DWORD PTR _i$[ebp]، 95 سم 17 96 جيلي $188 97 دولارًا أمريكيًا لـ40: :L24$ 98 99 { : 21 ; 100| DWORD PTR _i$[ebp]، 95 سم 17 | | :--- | | 96 جيلي $188 | | 97 دولارًا أمريكيًا لـ40: | | :L24$ 98 | | 99 | | { : 21 ; 100 |
77؛ 17: افعل } 78؛ 18: إذا (0 == أ 101
102 سنة
103 أمير القاعدة
80 سنة 104 أمير القاعدة
105
106 0
107 _نهاية
108 _الرب
85 109 سنوات
62 63؛ 14: إذا (0 = 0) انكسر؛ 86 L42$ 88 يناير 65 سم مكعب :L42$ 90 https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-60.jpg?height=40&width=516&top_left_y=570&top_left_x=988 "DWORD PTR _i$[ebp]، 95 سم 17 96 جيلي $188 97 دولارًا أمريكيًا لـ40: :L24$ 98 99 { : 21 ; 100" 77؛ 17: افعل } 78؛ 18: إذا (0 == a 101 102 إصدار بوب 103 بوب إيسي 80 سم 104 بوب إي بي إكس 105 إجازة 106 يمين 0 107 _الرئيسية ENDP 108 _نهاية النص 85 109 نهاية| 62 63؛ 14: إذا (0 = 0) انكسر؛ | 86 | | :--- | :--- | | | L42$ 88 يناير | | 65 سم مكعب | :L42$ 90 | | | ![](https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-60.jpg?height=40&width=516&top_left_y=570&top_left_x=988) | | DWORD PTR _i$[ebp]، 95 سم 17 <br> 96 جيلي $188 <br> 97 دولارًا أمريكيًا لـ40: <br> :L24$ 98 <br> 99 <br> { : 21 ; 100 | | | 77؛ 17: افعل } 78؛ 18: إذا (0 == a | 101 | | | 102 إصدار بوب | | | 103 بوب إيسي | | 80 سم | 104 بوب إي بي إكس | | | 105 إجازة | | | 106 يمين 0 | | | 107 _الرئيسية ENDP | | | 108 _نهاية النص | | 85 | 109 نهاية |
بشكل منفصل، ستتم إزالة FPU (FPU) من عامل التصفية. يُشار إلى الساي موجود حاليًا في أعلى المكدس بـ ST.
تسجيل جميع التعليمات نقطة ال

تعليمات حسابية

erands ملحوظات
تهيئة وحدة النقطة العائمة
n دفع البيانات إلى مكدس وحدة النقطة العائمة
ادفع 0.0 إلى مكدس FPU
n تخزين ST (أعلى المكدس) في الذاكرة
n قم بتخزين ST في الذاكرة ثم قم بإخراج ST
n إضافة البيانات إلى ST وتخزين النتيجة في ST
n طرح البيانات من ST وتخزين النتيجة في ST
n طرح ST من البيانات وتخزين النتيجة في ST
n ضرب البيانات باستخدام ST وتخزين النتيجة في ST
n قسمة ST على البيانات وتخزين النتيجة في ST
n قسمة البيانات على ST وتخزين النتيجة في ST
تقريب ST إلى عدد صحيح وتخزين النتيجة في ST
تغيير إشارة ST (ST = -ST)
n مقارنة قيم النقطة العائمة، وتعيين علامات FPU من C0 إلى C3
مقارنة ST بـ 0.0، وتعيين أعلام FPU من C0 إلى C3
نسخ كلمة حالة FPU إلى AX
erands Notes initialize the FPU n Push data onto the FPU stack Push 0.0 onto the FPU stack n Store ST (top of stack) to memory n Store ST to memory and pop ST n Add data to ST and store result in ST n Subtract data from ST and store result in ST n Subtract ST from data and store result in ST n Multiply data with ST and store result in ST n Divide ST by data and store result in ST n Divide data by ST and store result in ST Round ST to an integer and store result in ST Change the sign of ST (ST = -ST) n Compare floating point values, seting FPU flags C0-C3 Compare ST to 0.0, seting FPU flags C0-C3 Copy FPU status word to AX| erands | Notes | | :--- | :--- | | | initialize the FPU | | n | Push data onto the FPU stack | | | Push 0.0 onto the FPU stack | | n | Store ST (top of stack) to memory | | n | Store ST to memory and pop ST | | n | Add data to ST and store result in ST | | n | Subtract data from ST and store result in ST | | n | Subtract ST from data and store result in ST | | n | Multiply data with ST and store result in ST | | n | Divide ST by data and store result in ST | | n | Divide data by ST and store result in ST | | | Round ST to an integer and store result in ST | | | Change the sign of ST (ST = -ST) | | n | Compare floating point values, seting FPU flags C0-C3 | | | Compare ST to 0.0, seting FPU flags C0-C3 | | | Copy FPU status word to AX |
ample was generated using the Linux gcc compiler 1 ; however, to avoid confusion, I  ample was generated using the Linux gcc compiler  1 ; however, to avoid confusion, I  " ample was generated using the Linux gcc compiler "^(1)"; however, to avoid confusion, I "\text { ample was generated using the Linux gcc compiler }{ }^{1} \text {; however, to avoid confusion, I }أسماء الأيونات وترتيب المتعاملات لتكون متوافقة مع دليل Intel وx86 الآخر
pi*r*r);
    .string "%f\n"
.text
    .align 4
.globl main
    .type main,@function
main:
    push %ebp
    mov %ebp,%esp
    sub %esp,8
    mov -4(%ebp),1078530000 ! 0x40490fd0
    movl -8(%ebp),1048576000 ! 0x3e800000
    fld -4(%ebp)
    fmul -8(%ebp)
    fmul -8(%ebp)
    sub %esp,8
    fstp (%esp)
    push $.LC0
    call printf
    add %esp,12
    xor %eax,%eax
تزوج Hit تهيئة FPU d mem دفع البيانات إلى مكس FPU dz دفع 0.0 إلى مكد
إضافة 1 p op ST fadd mem تخزين St في الذاكرة و fstp mem المكدس) في الذاكرة
ST fsob النشيجة في ST وتخزين النيجة في ST ور البيانات من ST fsub mem و ST
ST fdiv r r rr hem وتخزين اللتيجة في ST ترب البيانت في ST fmul mem التيجة في ST
إفرندينج وتخزين اللنتجة في ST fdivr mem قسمة الليانات على ST وتخزين اللنتيجة
ST (ST = -ST) تغيير إشارة ST fchs صحيح وتخز بن النتجية في
AX اضبط
fl AX إلى FPU سخ كلمة حالة
st mem Hit تهيئة FPU d mem دفع البيانات إلى مكس FPU dz دفع 0.0 إلى مكد إضافة 1 p op ST fadd mem تخزين St في الذاكرة و fstp mem المكدس) في الذاكرة ST fsubr النشيجة في ST وتخزين النيجة في ST ور البيانات من ST fsub mem و ST ST fdiv r hem وتخزين اللتيجة في ST ترب البيانت في ST fmul mem التيجة في ST Ifrndint وتخزين اللنتجة في ST fdivr mem قسمة الليانات على ST وتخزين اللنتيجة ST (ST = -ST) تغيير إشارة ST fchs صحيح وتخز بن النتجية في AX اضبط https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-62.jpg?height=45&width=1044&top_left_y=1110&top_left_x=151 fl AX إلى FPU سخ كلمة حالة | st mem | Hit تهيئة FPU d mem دفع البيانات إلى مكس FPU dz دفع 0.0 إلى مكد | | :--- | :--- | | إضافة 1 p op | ST fadd mem تخزين St في الذاكرة و fstp mem المكدس) في الذاكرة | | ST fsubr | النشيجة في ST وتخزين النيجة في ST ور البيانات من ST fsub mem و ST | | ST fdiv $r$ | hem وتخزين اللتيجة في ST ترب البيانت في ST fmul mem التيجة في ST | | Ifrndint | وتخزين اللنتجة في ST fdivr mem قسمة الليانات على ST وتخزين اللنتيجة | | | ST (ST = -ST) تغيير إشارة ST fchs صحيح وتخز بن النتجية في | | | | | | | | | | | | | | | | | | | | | | | | | | AX اضبط | ![](https://cdn.mathpix.com/cropped/2025_07_10_f6cce6956a3ccd95ff1eg-62.jpg?height=45&width=1044&top_left_y=1110&top_left_x=151) | | | fl AX إلى FPU سخ كلمة حالة | | | |
تم إنشاء المثال التالي باستخدام مُجمِّع Linux gcc؛ ومّع ذلك، لتجنب الارتباك، قمت بتخيير أسماء التعليمات وترتيب العمليات لنكون متو افقة C الأخرى.
، pi r r) { ! 0
, pirr) { ! 0| , pi*r*r) | | :--- | | { ! 0 |
"gcc -S fo ocl سوف
", pirr) { ! 0" "gcc -S fo ocl سوف| , pi*r*r) <br> { ! 0 | | :--- | | | | "gcc -S fo ocl سوف |
"f\n%" سلسلة . 6
نص
4 . 8
الرئيسي لوبل 1.9
يكتب عين @
:رئيسية 11
نسبة ضغط الدم الانقباضي دفع
ebp،%e ص حركة
وخاصةً 8% فرعي 14
"f\n%" سلسلة . 6 نص 4 . 8 الرئيسي lobl 1.9 type ain @ :رئيسية 11 ebp% دفع ebp,%e pp حركة esp,8% فرعي 14| "f\n%" | سلسلة | . 6 | | :--- | :--- | :--- | | نص | | | | 4 | . 8 | | | الرئيسي | lobl | 1.9 | | type | ain | @ | | :رئيسية | 11 | | | ebp% | دفع | | | ebp,%e | pp | حركة | | esp,8% | فرعي | 14 |
17 فلورا -4)
18 ميكرومول -8(ebp%)
fmul -8(%ebp) 19
20 فرعي %esp
fstp (%esp) 21
22 LC0. ادفع
23 استدعاء printf
24 إضافة esp،12%
xor %eax,%eax 25
31 .Lfe1:
32.الحجم الرئيسي،.Lfe1-الرئيسي
33 .ident
34 “GCC: (GNU) egcs-2.91.66 19990314/Linux”
:Lfe1.31
32 ـ الحجم الرئيسي، ـ Lfe1-الرئيسي
ident. 33
“GCC: (GNU) egcs-2.91.66 19990314/Linux” 34