سؤال

أنا جديد في لغة MIPS ولا أفهم كيف تعمل الوظائف (الإجراءات) في لغة مجموعة MIPS. هنا ولكن سأحدد مشكلتي:

  1. ماذا فعلت:

    • jal
    • jr
    • $ra

    يعني في لغة MIPS والشيء المهم

  2. كيف يمكننا استخدامها عندما نريد إنشاء وظيفة أو (إجراء)؟
هل كانت مفيدة؟

المحلول

أولاً ، قد ترغب في التحقق هذه مرجع 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 نفسها).

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