وظائف (الإجراءات) في MIPS
سؤال
أنا جديد في لغة MIPS ولا أفهم كيف تعمل الوظائف (الإجراءات) في لغة مجموعة MIPS. هنا ولكن سأحدد مشكلتي:
ماذا فعلت:
jal
jr
$ra
يعني في لغة MIPS والشيء المهم
- كيف يمكننا استخدامها عندما نريد إنشاء وظيفة أو (إجراء)؟
المحلول
أولاً ، قد ترغب في التحقق هذه مرجع MIPs السريع. انها ساعدتني حقا.
ثانيا ، لشرح jal
, jr
و $ra
. ماذا jal <label>
هل القفز إلى label
تسمية وتخزين عداد البرنامج (فكر في الأمر كعنوان للتعليمات الحالية) في $ra
تسجيل. الآن ، عندما تريد العودة من label
إلى حيث كنت في البداية ، أنت فقط تستخدم jr $ra
.
هذا مثال:
.text
main:
li $t0, 1
jal procedure # call procedure
li $v0, 10
syscall
procedure:
li $t0, 3
jr $ra # return
ستلاحظ عند تشغيل هذا في محاكي spim أن القيمة المتبقية في $t0
هو 3 ، واحد تم تحميله في ما يسمى إجراء.
أتمنى أن يساعدك هذا.
نصائح أخرى
1. الأولان هما التعليمات ، والثالث نوع من السجل الخاص
- jal = Jump and Link (عنوان التعليمات التالية وضعت في $ RA ، وقفز إلى العنوان المستهدف)
- JR = القفز لتحديد السجل
- $ RA = عنوان الإرجاع
غالبًا ما نستخدم التعليمات مثل هذا ...
- JR $ RA (نسخ $ RA إلى عداد البرنامج)
وهذا يعني العودة (القفز) إلى العنوان المحفوظ في $ RA.
2.
إليك وظيفة مثال (الإجراء) في ج
int main(){
x=addthem(a,b);
}
int addthem(int a, int b){
return a+b;
}
وظيفة في MIPS
.text
main: #assume value a is already in $t0, b in $t1
add $a0,$0,$t0 # it's the same function as move the value
add $a1,$0,$t1
jal addthem # call procedure
add $t3,$0,$v0 # move the return value from $v0 to where we want
syscall
addthem:
addi $sp,$sp,-4 # Moving Stack pointer
sw $t0, 0($sp) # Store previous value
add $t0,$a0,$a1 # Procedure Body
add $v0,$0,$t0 # Result
lw $t0, 0($sp) # Load previous value
addi $sp,$sp,4 # Moving Stack pointer
jr $ra # return (Copy $ra to PC)
سوف ترغب في قراءة نظام V Application Binary Interface ، ملحق معالج MIPS RISC. يصف هذا الاتفاقيات المستخدمة لوظائف الاتصال ، ولا سيما كيفية إدارة المكدس ويتم تبادل المعلمات (لا توجد مكدس للأجهزة في MIPs ، كل شيء هو مسألة اتفاقيات البرمجيات ، ويحدد ABI تلك الاتفاقيات).
تفترض المستند أعلاه بعض المعرفة الأساسية بما تفعله تعليمات MIPS ، لذلك ستحتاج أيضًا إلى العمارة MIPS32 للمبرمجين, ، على وجه الخصوص ، المجلد الثاني (مجموعة التعليمات) ، والذي يصف التأثير التفصيلي لكل تعليمات. ولكن ، تفضل نفسك ، قم بتنزيل وقراءة المجلد الأول (مقدمة) أولاً.
ال jal
التعليمات هي "القفز و حلقة الوصل"Opcode. إنه يقفز في العنوان الهدف (وهو عنوان الرمز الأول للإجراء المتصل) مع حفظ مؤشر التعليمات الحالي في سجل الرابط, ، وهو السجل 31 (بدقة ، يحفظ في السجل 31 القيمة x+8 ، حيث x هو عنوان jal
Opcode نفسها).