مكافئات Z80 DJNZ التعليمات على أبنية?
-
22-09-2019 - |
سؤال
أولا الخلفية قليلا.على z80 وحدة المعالجة المركزية لديها تعليمات دعا DJNZ والتي يمكن أن تستخدم بطريقة مماثلة كما for
حلقة.أساسا DJNZ decrements ب التسجيل و يقفز إلى التسمية إذا لم الصفر.على سبيل المثال:
ld b,96 ; erase all of the line
disp_version_erase_loop:
call _vputblank ; erase pixels at cursor (uses b reg)
djnz disp_version_erase_loop ; loop
بالطبع يمكنك أن تفعل الشيء نفسه باستخدام العادية مقارنة والقفز تعليمات ، ولكن في كثير من الأحيان هو مفيد استخدام تعليمة واحدة.
مع أن الخروج من الطريق ، سؤالي هو هل وحدة المعالجة المركزية الأخرى تشمل أبنية مماثلة التحكم التعليمات ؟
المحلول
كان ذلك تعليمات شائعة إلى حد ما على آلات تلك الحقبة ، ويحدث في العديد من الأماكن الأخرى أيضًا.
- يدعمها Corewar باستخدام تعليمات DJN مع وضع معالجة ما قبل الانزلاق.
- على نفس المنوال يدعم M68K BNE مع وضع معالجة ما قبل الانهيار.
- الحد الأدنى PDP-8 لديه تعليمات مماثلة
ISZ - زيادة المعامل وتخطي إذا كانت النتيجة صفر.
وهلم جرا
نصائح أخرى
في الحقيقة في IA-32 المباشر أي ما يعادل DJNZ هو LOOPcc (LOOPZ).تذكر Z80 و 8086 نفس السلف إنتل 8080.لذلك كل x86 وحدة المعالجة المركزية مباشرة ترث DJNZ التعليمات!
IA-32 لديه مختلف REP*
الإرشادات التي تستخدم CX كضكانها
PowerPC لديه bdnz
وسجل العد الخاص ctr
. تراجعي ctr
والتشغيل المشروط مستقل عن اختبار الحالة الفعلية ، بحيث يمكنك إضافة شرط على رأسه bdnz
, ، على سبيل المثال bdnzlt cr5, label
(إذا كانت الذاكرة) ستتحقق مما إذا كان المخزّن أقل من البتات في CR5 و OR أو أو ذلك بشرط ctr
تصبح 0.
بسخرية، ctr
يستخدم أيضًا لتخزين أي وجهة استدعاء وظيفة غير مباشرة. لذلك من الممكن ترميز التعليمات "الانخفاض ctr
وفرش إلى قيمته الجديدة إن لم يكن صفر "، ولكن هذا ممنوع على وجه التحديد. (لن يتحقق من مؤشر فارغ على أي حال.) بشكل كبير إلى حد ما ، bdnz
يصبح عديمة الفائدة إلى حد ما في حلقة مع مكالمة غير مباشرة.
بعض متحكم الموافقة المسبقة عن علم مثل PIC18 لديها تعليمات DecfSZ (انخفاض وتخطي إذا صفر) تعليمات. لقد وضعت في كثير من الأحيان decfsz تليها فرع.
توجد أجهزة كمبيوتر تعليمية واحدة ، والتي لم تستخدم بالفعل. لكن أحد آلات مجموعة التعليمات الفردية هو "طرح وفرع إذا كان أقل من أو يساوي الصفر" (subleq
) آلة. ويكيبيديا لديها المزيد حول هذا
لست على دراية بأي آلات حقيقية أخرى لها تعليمات مثل هذا تمامًا. أنا أحب آلات RISC ، ولا أرى حاجة إليها أيضًا.
سبقت PDP-11 (حوالي 1970) Z-80 بحوالي 5 سنوات ، وعلى الأقل بعض النماذج (على الرغم من أنها ليست في وقت مبكر) كانت أ طرح واحد والفرع تعليمات:
sob R, offset
في x86 ، هناك تعليمات الحلقة التي تفعل نفس الشيء بالضبط (مع العداد في ECX). هناك أيضًا تعليمات JECXZ (القفز إذا كانت ECX صفرًا) والتي من المفترض أن يتم استخدامها مع حلقة - يمكنك وضعها قبل الحلقة حتى تتمكن من تخطي الحلقة بأكملها إذا كان العدد صفراً في البداية.
مثله:
;number of iterations in ECX
JECXZ end
start:
;loop body
LOOP start
end:
لكن لاحظ أن هذه التعليمات غير فعالة بشكل فظيع على وحدات المعالجة المركزية المعاصرة. من الأفضل استخدام تعليمات CMP/Sub و JCC العادية. في ملاحظة جانبية - تكون وحدة المعالجة المركزية Intel Core2 قادرة فعليًا على علاج زوج تعليمات القفز+كما لو كانت تعليمة واحدة - يسمونها "اندماج ماكرو".
كان Z80 معالج CISC. DJNZ هو مثال كلاسيكي لتعليمات معقدة. الأزياء الحديثة تجاه مجموعات تعليمات RISC التي تفضل تعليمات أصغر وأبسط وأسرع ولكن يمكن معالجتها بسرعة أكبر - خاصة مع ميزات أنابيب أنابيب متقدمة. لا أعتقد أنك تحصل على أي شيء مثل هذا على عائلة ARM ، على سبيل المثال.