функции (процедуры) в MIPS

Я новичок в языке MIPS, и я не понимаю, как работают функции (процедуры) на языке сборки MIPS. Вот только я уточню свою проблему:

  1. что:

    • jal
    • jr
    • $ra

    mean на языке mips и важная вещь

  2. как мы можем использовать их, когда мы хотим создать функцию (или процедуру)?

3 ответов


во-первых, вы можете проверить этой быстрая ссылка MIPS. Это действительно помогло мне.

во-вторых, объяснить jal, jr и $ra. Что?!--4-- > делает это перейти к 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=перейти и ссылка (адрес следующей инструкции положить в $ra,и перейти к целевому адресу)
  • jr=перейти, чтобы указать register
  • $ra=обратный адрес

мы часто используем такую инструкцию ...

  • jr $ra (копировать $ra в счетчик программ)

это означает возврат(переход) на адрес, сохраненный в $РА .

2.

вот пример функции (процедуры) в C

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,,$t0   # it's the same function as move the value
    add $a1,,$t1 
    jal addthem      # call procedure
    add $t3,,$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,,$t0      # Result

    lw $t0, 0($sp)      # Load previous value
    addi $sp,$sp,4      # Moving Stack pointer 
    jr $ra              # return (Copy $ra to PC)

вы захотите прочитать двоичный интерфейс приложения System V, дополнение процессора MIPS RISC. Это описывает соглашения, используемые для вызова функций, в частности, как стек управляется и параметры обмениваются (в MIPS нет аппаратного стека, все дело в соглашениях программного обеспечения, и ABI определяет эти соглашения).

документ выше предполагает некоторые базовые знания о том, что делают инструкции MIPS, поэтому вам также понадобится архитектура MIPS32 для программистов, в частности Том II (набор инструкций), в котором подробно описывается эффект каждой инструкции. Но, сделайте себе одолжение, сначала загрузите и прочитайте Том I (введение).

на jal инструкция-это "прыжок и ссылке" код. Это скачков по целевому адресу (который является адресом первого кода операции вызываемой процедуры) при сохранении текущего указателя инструкции в связь регистров, который является регистром 31 (точнее, он сохраняет в регистре 31 значение x+8, где x адрес jal сам код операции).