سؤال

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

divu     s,t    lo <-- s div t ; hi <-- s mod t
multu    s,t    hi / lo < -- s * t ;

لذلك ، divu متجر نتيجة الانقسام في LO و ما تبقى في HI, في حين multu متجر نتيجة الضرب في LO (أقل من 4 بايت) ، HI (4 بايت).

في وقت لاحق من أجل الحصول على النتيجة من HI و LO يسجل أستطيع:

mfhi $v0
mflo $v1

أنا بالفعل عرفت كيف لتخزين نتيجة حساب في LO:

ori     $v0,$0,1            # Store result from $a0 into LO
divu    $a0,$v0
  • على divu متجر نتيجة شعبة في لو ، لذا تقسم النتيجة 1 للحصول عليه هناك.

إلا أن تخزين في HI هو أكثر تعقيدا.طريقة واحدة أن القوة multu تعليمات لتحويل قيمة 32 بت (4 بايت):

multu    $a0,0x80000000     # Shift $a0 by 32 bits and store into HI/LO

ولكن النتيجة هي أن القيمة في HI 1 بت حق حيث يجب أن تكون (حتى إذا القيمة 0100 1000 ثم HI سوف تحتوي على 0010 0100).

لا أحد يعرف كيفية تخزين شيء في HI التسجيل ؟

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

المحلول

أود أن أقدم نيلس Pipenbrinck الجواب:

من MIPS32 arquitechture للمبرمجين

mthi

الشكل:MIPS32 (MIPS أنا)

  MTHI rs

الغرض:نسخ GPR إلى الغرض الخاص مرحبا التسجيل

Description: HI ← rs

محتويات GPR rs يتم تحميلها في سجل خاص مرحبا.

القيود:

المحسوبة النتيجة مكتوبة مرحبا/لو زوج طريق شعبة ، DIVU,MULT, أو MULTU يجب أن تقرأ من قبل MFHI أو MFLO قبل نتيجة جديدة يمكن أن تكون مكتوبة في إما مرحبا أو لو.إذا MTHI التعليمات يتم تنفيذها بعد واحدة من هذه التعليمات الحسابية ، ولكن قبل MFLO أو MFHI تعليمات محتويات لو لا يمكن التنبؤ بها.يوضح المثال التالي هذا الوضع غير القانوني:

 MUL       r2,r4   # start operation that will eventually write to HI,LO
 ...               # code not containing mfhi or mflo
 MTHI      r6
 ...               # code not containing mflo
                   # this mflo would get an UNPREDICTABLE value
 MFLO      r3

معلومات تاريخية:

في MIPS I-III, إذا كان أي من السابقتين التعليمات MFHI ، ونتيجة ذلك MFHI لا يمكن التنبؤ بها.يقرأ مرحبا أو لو سجل خاص يجب أن تكون مفصولة من أي لاحقة التعليمات التي أكتب لهم من قبل اثنين من أو أكثر من التعليمات.في MIPS الرابع في وقت لاحق, بما في ذلك MIPS32 و MIPS64 هذا التقييد لا وجود لها.

mtlo

الشكل:MIPS32 (MIPS أنا)

    MTLO rs

الغرض:نسخ GPR إلى الغرض الخاص لو سجل وصف:

 LO ← rs

محتويات GPR rs يتم تحميلها في سجل خاص لو.

القيود:المحسوبة النتيجة مكتوبة مرحبا/لو زوج طريق شعبة ، DIVU, MULT, أو MULTU يجب أن تقرأ من قبل MFHI أو MFLO قبل نتيجة جديدة يمكن أن تكون مكتوبة في إما مرحبا أو لو.

إذا MTLO التعليمات يتم تنفيذها بعد واحدة من هذه التعليمات الحسابية ، ولكن قبل MFLO أو MFHI التعليم محتويات مرحبا لا يمكن التنبؤ بها.يوضح المثال التالي هذا الوضع غير القانوني:

 MUL       r2,r4   # start operation that will eventually write to HI,LO
 ...               # code not containing mfhi or mflo
 MTLO      r6
 ...               # code not containing mfhi
                   # this mfhi would get an UNPREDICTABLE value
 MFHI      r3

معلومات تاريخية:

في MIPS I-III, إذا كان أي من السابقتين التعليمات MFHI ، ونتيجة ذلك MFHI لا يمكن التنبؤ بها.يقرأ مرحبا أو لو سجل خاص يجب أن تكون مفصولة من أي لاحقة التعليمات التي أكتب لهم من قبل اثنين من أو أكثر من التعليمات.في MIPS الرابع في وقت لاحق, بما في ذلك MIPS32 و MIPS64 هذا التقييد لا وجود لها.

نصائح أخرى

تحتوي مجموعة تعليمات MIPS على نظير لـ MFLO/MFHI.

يطلق عليه MTLO/MTHI ويفعل ما تريده بالضبط:

  mtlo $v0  # moves the contents of v0 into the lo-register
  mthi $v1  # moves the contents of v1 into the hi-register

هذه التعليمات نادرة وغالبًا ما لا تكون موجودة في مراجع مجموعة التعليمات المختصرة.

بالمناسبة:تأكد من مراجعة دليل المعالج حول زمن الاستجابة والمخاطر المرتبطة بتسجيلات LO/HI.إنها مميزة جدًا وقد يتطلب الكود الخاص بك أشياء مثل الانتظار ثلاث دورات على الأقل بين الكتابة والقراءة.لسوء الحظ، يعتمد هذا السلوك على وحدة المعالجة المركزية التي تعمل عليها.

يعد فهم هذا الأمر بشكل خاطئ مأزقًا شائعًا لمبرمجي MIPS الطموحين :-)

فكر في القيم المتطرفة الأخرى التي قد تنتج نتائج مثيرة للاهتمام عند استخدامها كوسيطة ثانية لـ multu/divu (أكون غامضًا عن عمد لأن هذا يبدو وكأنه سؤال واجب منزلي).

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