الدرس 6 من 8
المحاكي
- 18 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
تنفيذ البايتكود خطوة خطوة
الشرح
المفكّك يخبرك بما في البرنامج، والمحاكي (emulator) يخبرك بما يفعله. فبدل أن تقرأ الأوامر تنفّذها واحدًا واحدًا على مُراكِم في Python، وتجمع ما يُخرجه البرنامج. وهكذا يدرس الباحثون برامج كُتبت لمعالجات لا يملكونها، فيشغّلونها خطوة خطوة في محاكٍ ويراقبون كل قيمة.
0x00 HALT break 0x01 LOAD imm acc = imm 0x02 ADD imm acc = (acc+imm) & 0xFF 0x03 XOR imm acc = acc ^ imm 0x04 SUB imm acc = (acc-imm) & 0xFF 0x05 OUT out.append(acc)
والحساب كلّه في بايت واحد، أي بالباقي على 256. فإذا كان المُراكِم 255 وأضفت إليه 2 صار 1 لا 257، وإذا طرحت 8 من 5 صار 253. والقناع & 0xFF يفعل هذا في Python، فيُبقي البتات الثمانية الدنيا من أي عدد، حتى السالب منها.
وهيكل كل محاكٍ واحد: عدّاد (program counter) يشير إلى الأمر الحالي، وحلقة تقرأ الأمر وتنفّذه ثم تتقدّم بطول التعليمة، بايتًا للأمر المفرد وبايتين للأمر ذي المُعامَل. والأمر HALT يوقف التنفيذ ولو بقيت بعده بايتات.
المطلوب
اكتب الدالة run(program) التي تنفّذ البرنامج وتُرجع مخرجات أوامر OUT من النوع bytes. والبرنامج program في كود البداية يطبع كلمة من حرفين، شغّله بمحاكيك لتعرفها.
الفحوص
6 فحوص- تطبع مخرجات برنامج الشرح
- الجمع يبدأ من صفر ويلتفّ بالباقي 256
- الطرح يلتفّ بالباقي 256
- الأمر XOR يعمل
- برنامج يطبع كلمة لم ترها
- الأمر HALT يوقف التنفيذ