تستخدم العديد من وحدات المعالجة المركزية نموذج آلة التجميع.
يحتوي 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
تسميات السجل العامة لوحدات المعالجة المركزية xx86\times 86 .
تسميات السجل العام لوحدات المعالجة المركزية x86.
31
سجل EFLAGS.
سيجم إنتريج إيستر
قاعدة إضافة ress )4M S b its( رجال أوري -S egn و tt
الوضع الحقيقي، نموذج الذاكرة المجزأة.
3
ملاحظة: إذا لم يتم إدراجه، فهذا يعني أن وحدة المعالجة المركزية محجوزة، ولا يتم تعريفها
31
سجل EFLAGS.
مو حقيقي، مو ديل الذاكرة المجزأة.
الوضع المحمي، نموذج الذاكرة المجزأة.
r، ويتم وضع المكدس في مقطع ثالث. يُعطى كل مقطع عنوانه الخاص بطول ytes. عناوين 16 بت التي يستخدمها البرنامج هي في الواقع إزاحة من ess. يُسمى هذا الوضع الحقيقي، ونموذج الذاكرة المجزأة، والتعليمات والبيانات هي عناوين أساسية محفوظة في سجل المقطع (انظر الرسم التخطيطي). سجلات المقطع (at)، وSS (مقطع المكدس)، وDS، وES، وFS، وGS (جميع مقاطع البيانات). يمكن للنموذج المجزأ أن يستوعب حجم ذاكرة يصل إلى 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 على القيمة نفسها. يُبسط هذا الوضع الأمور كثيرًا، مما يجعل عملية التجزئة وحماية الذاكرة أمرًا سهلاً بالنسبة للمبرمجين. "]:}\begin{aligned}
& \text { تعدد المهام: يتيح للمعالج الدقيق التبديل من برنامج إلى آخر حتى يتمكن الكمبيوتر من تنفيذ العديد من البرامج في وقت واحد. } \\
& \text { في نموذج الذاكرة المجزأة في الوضع المحمي، يحتوي مقطع الكود على مجمو عة في جدول الواصف العام، حيث تُخزن تفاصيل إضافية حو } \\
& \text { الذاكرة. يشير سجل خاص يُسمى GDTR إلى موقع GDT، وتحنفظ سجلات المقطع بمجموعات تشير إلى المُدخل المطلوب الُسمى واص } \\
& \text { الرسم التخطيطي). يستخدم نظام التشغيل Minix وضعًا محميًا، و هو وضع ذاكرة مجزأة. يبدأ Minix في هذا الوضع ويبقى فيه. يمكن العثو } \\
& \text { المراجع وعلى الإنترنت تصفَ كيف يُكن لبرنامج DOS تحويل المُعالج إلى الوضع المحمي ثم العودة إلى الوضع الحقيقي عند إغلاقه } \\
& \text { تستخدم أنظمة التشغيل الحديثة القائمة على x86 (ويندوز ولينكس) وضعًا محيًا في نموذج الذاكرة، حيث تُضبط جميع عناوين الذاكرة الأس } \\
& \text { في GPT على القيمة نفسها. يُبسط هذا الوضع الأمور كثيرًا، مما يجعل عملية التجزئة وحماية الذاكرة أمرًا سهلاً بالنسبة للمبرمجين. }
\end{aligned}
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[\mathrm{EBP}]
;; البيانات في 16+EBP16+\mathrm{EBP} تذهب إلى EBX
,[ebp+16][\mathrm{ebp}+16]
;; نفس ما ورد أعلاه
[ebp]16[\mathrm{ebp}] 16
;; نفس ما ورد أعلاه
I][EBP],10\mathrm{I}][\mathrm{EBP}], 10
;10; 10 يذهب إلى EDI+EBP
I][EBP+16],18\mathrm{I}][\mathrm{EBP}+16], 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 بدلاً من ذلك
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
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\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\leftarrowlarr\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. تجدر الإشارة إلى أن هذا هو المخطط الذي تستخدمه المُجمِّعات. يتبع بعض مبرمجي التجميع هذا الـ يدويًا. لكن العديد من مبرمجي التجميع لا يكترثون أبدًا بضبط مؤشر الإطار .
تقوم الوظيفة المستدعية بدفع معمات الوظيفة إلى الـ
تقوم تعليمات الاستدعاء بدفع عنوان الإرجاع (سجل 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 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 jj ، int 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
2. انتقل إلى الموقع الجديد (اضبط eip على موقع التعليمات لوظيفة الذ
اترك 1. هوف esp،ebp
2 2 ص المرجع ebp | إعادة تعيين مؤشر الإطار
| ret nn 1. pop op eip
2. انسخ n كلمة وتخلص منها | نك,
المثال المثال أكثر شمولاً، حاول رسم خريطة. تحقق من خريطة الذاكرة لايك باستخدام خريطة الذاكرة المنشورة على صفحة الويب فئة البيانات العامة والمحفوظة في قسم bss والبيانات في الذاكرة.
، int bb ، int cc )
نص؛ .sect .rom؛ .sect .data؛ .sect .bss
5! gdata =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 | |
قارن النتيجة (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. يسمح هذا الاختلاف لعملية الإزاحة بتوفير آلية سريعة لأيٍّ من
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
التحكم على الفور|  |
| :--- |
| التحكم على الفور |
(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 اختبار | |
|  <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]
النسخة 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;\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
xample، الذي يحتوي على بضعة جداول انتقال nple إضافية لتحديد e. يملأ هذا الكود أيضًا مساحة من pp] إلى -13 [ebp] بـ cccccc بالتناوب. لا أعرف لماذا يبدو أن هذا يُنجز أي شيء.
}
}
العامة _ الرئيسية ;COMDAT _main _قطعة نصية
_i$ = -4 _(-)j^($)=-8{ }_{-} \mathrm{j}^{\$}=-8
_main PROC NEAR
; 2 : { دفع ebp mov ebp، esp فرعية خاصة، 76 ادفع ebx ادفع إيسي دفع تحرير
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 أنت
وحدة حسابية، تُسمى وحدة النقطة العائمة (FPU)، تحتوي على ثمانية سجلات. يُشار إلى السجل الموجود حاليًا في أعلى المكدس باسم ST. تُحدد الهياكل المعاملات المتعلقة بـ ST.
بشكل منفصل، ستتم إزالة 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 "\text { ample was generated using the Linux gcc compiler }{ }^{1} \text {; however, to avoid confusion, I } أسماء الأيونات وترتيب المتعاملات لتكون متوافقة مع دليل Intel وx86 الآخر
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 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 اضبط |  |
| | fl AX إلى FPU سخ كلمة حالة |
| | |
تم إنشاء المثال التالي باستخدام مُجمِّع Linux gcc؛ ومّع ذلك، لتجنب الارتباك، قمت بتخيير أسماء التعليمات وترتيب العمليات لنكون متو افقة C الأخرى.