تخزين القيم في مرحبا و لو سجلات MIPS
-
05-07-2019 - |
سؤال
أنا كتابة بعض التعليمات البرمجية في 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 (أكون غامضًا عن عمد لأن هذا يبدو وكأنه سؤال واجب منزلي).