سؤال

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

الآن وقد حل الصيف، بدأ مشروع جديد بهدف إعادة كتابة المترجم والمجمع لـ Whitespace 0.3، مع المزيد من التطورات القادمة بعد ذلك.وبما أن هناك الكثير من الوقت الإضافي للعمل على تصميمها، فسيتم تقديم مخطط تفصيلي لك هنا يوفر مجموعة منقحة من أساليب الإستذكار للغة التجميع.تم وضع علامة على هذا المنشور باعتباره ويكي لمناقشتهم.

هل كان لديك أي خبرة في لغات التجميع في الماضي؟هل كانت هناك بعض التعليمات التي اعتقدت أنه يجب إعادة تسميتها إلى شيء مختلف؟هل وجدت نفسك تفكر خارج الصندوق وبنموذج مختلف عن الذي تم فيه تسمية فن الإستذكار؟إذا كان بإمكانك الإجابة بنعم على أي من هذه الأسئلة، فأنت موضع ترحيب كبير هنا.هي موضع تقدير الإجابات الذاتية!


معالجة المكدس (IMP:[فضاء])

تعد معالجة المكدس إحدى العمليات الأكثر شيوعًا، ومن هنا قصر IMP [Space].هناك أربعة تعليمات المكدس.

hold N       Push the number onto the stack
copy         Duplicate the top item on the stack
copy N       Copy the nth item on the stack (given by the argument) onto the top of the stack
swap         Swap the top two items on the stack
drop         Discard the top item on the stack
drop N       Slide n items off the stack, keeping the top item

الحسابية (IMP:[علامة التبويب] [مسافة])

تعمل الأوامر الحسابية على العنصرين العلويين في المكدس، وتستبدلهما بنتيجة العملية.يعتبر العنصر الأول الذي تم دفعه من ترك المشغل.

add          Addition
sub          Subtraction
mul          Multiplication
div          Integer Division
mod          Modulo

الوصول إلى الكومة (IMP:[علامة التبويب] [علامة التبويب])

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

save         Store
load         Retrieve

التحكم في التدفق (إمب:[LF])

عمليات التحكم في التدفق شائعة أيضًا.يتم تمييز الإجراءات الفرعية بالتسميات، بالإضافة إلى أهداف القفزات المشروطة وغير المشروطة، والتي يمكن من خلالها تنفيذ الحلقات.يجب إنهاء البرامج عن طريق [LF] [LF] [LF] حتى يتمكن المترجم من الخروج بشكل نظيف.

L:           Mark a location in the program
call L       Call a subroutine
goto L       Jump unconditionally to a label
if=0 L       Jump to a label if the top of the stack is zero
if<0 L       Jump to a label if the top of the stack is negative
return       End a subroutine and transfer control back to the caller
halt         End the program

الإدخال/الإخراج (إمب:[علامة التبويب] [LF])

وأخيرا، نحن بحاجة إلى أن نكون قادرين على التفاعل مع المستخدم.توجد تعليمات IO لقراءة وكتابة الأرقام والأحرف الفردية.مع هذه، يمكن كتابة إجراءات معالجة السلسلة.تأخذ تعليمات القراءة عنوان الكومة الذي سيتم تخزين النتيجة فيه من أعلى المكدس.

print chr    Output the character at the top of the stack
print int    Output the number at the top of the stack
input chr    Read a character and place it in the location given by the top of the stack
input int    Read a number and place it in the location given by the top of the stack

سؤال: كيف يمكنك إعادة تصميم أو إعادة كتابة أو إعادة تسمية فن الإستذكار السابق ولأي أسباب؟

هل كانت مفيدة؟

المحلول

  • اضغط #n، لتوضيح أن n هو أمر فوري.
  • أعتقد أن كلمة "مبادلة" تكون في بعض الأحيان "exc" أو "exch".
  • "حفظ" عادة ما يكون "st" (متجر)
  • "الحمل" عادة ما يكون "ld"
  • يمكن أن تكون كلمة "call" أيضًا "jsr" أو "bl".
  • كلمة "goto" عادة ما تكون "jmp" أو "bra"
  • "if=0" عادةً ما يكون "beq"
  • "if<0" عادة ما تكون "blt"
  • عادةً ما تكون كلمة "return" هي "ret" أو "blr"
  • "الخروج" عادة ما يكون "توقف"/"hlt" في سياق وحدة المعالجة المركزية.
  • "print chr" و"print int" يمكن أن يكونا "print.c" و"print.i".هناك العديد من الطرق لتحديد متغيرات التعليمات، ولكنها عادة لا تكون موجودة في المعاملات.

يحرر:

إذا كنت لا تمانع في الخلط بين أكواد التشغيل وأوضاع العنونة، باستخدام بناء جملة CISCy،

  • "ادفع (sp)" بدلاً من "نسخ"
  • "ادفع N(sp)" بدلاً من "نسخ N" (ضرب المعامل بحجم الكلمة)
  • "push *(sp)" بدلاً من "load" (باستثناء أنه يظهر قبل دفع القيم المحملة)
  • "pop *1(sp)" بدلاً من "push" (باستثناء أنه يظهر مرتين بالفعل)

من ناحية أخرى، عادةً ما تتعامل التعليمات البرمجية المستندة إلى المكدس مع الدفع والبوب ​​على أنها ضمنية.في هذه الحالة، "imm n" (فوري) بدلاً من "دفع".إذن جميع عمليات المكدس هي عمليات مكدسة بحتة، وهي لطيفة ومتسقة.

لست متأكدًا من كيفية كتابة "drop N" - فالوصف يجعل الأمر يبدو وكأن "drop 1" لا يعادل "drop" وهو ما يبدو غريبًا.

نصائح أخرى

أعتقد أن التغيير الأول الذي أقترحه هو تغيير الضغط والإفلات إلى الضغط والبوب ​​على التوالي.

ثم ربما أعيد تسمية نسخة إلى dup (أعتقد أن هذا هو الاسم الأكثر شيوعًا لهذه العملية في اللغات الموجهة نحو المكدس).

أنا في حيرة قليلاً لماذا غالبًا ما يكون لديك تفسيرات قصيرة من كلمة واحدة مختلف إلى ذاكري.على سبيل المثال، التذكير هو "حفظ"، والشرح هو "متجر".ذاكري هو تحميل، والتفسير هو استرجاع.بالمناسبة، هذين هما فن الإستذكار اللذان لم يتم شرحهما بشكل كافٍ بالنسبة لي.حفظ ماذا أين؟تحميل ماذا من أين؟(يحرر تم تحرير السؤال لاحقًا لتوضيح هذه المعاني)

شكرا لهذا المنصب مثيرة للاهتمام.

لست متأكدًا من أنني أفهم سؤالك تمامًا ، لذا إذا كنت خارج القاعدة ، سامحني.

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

أود بعد ذلك إضافة "إذا" تشكل هذه الأعلام.

أود أن أضيف تحول بت وتدوير (كل من اليسار واليمين) ، وكذلك و/أو/xor/غير العمليات التي تعمل على البتات.

من المرجح أن ترغب في الوصول إلى نوع من الوصول إلى الذاكرة ، إلا إذا كنت تنوي تعليمات الإدخال/الإخراج لعلاج الذاكرة كتيار من القيم لشعور آلة Turing الجيدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top