Подтвердить что ты не робот

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

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

  • Что делает:

    • jal
    • jr
    • $ra

    означает в языке mips и важную вещь

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

Ответ 1

Во-первых, вы можете проверить эту быструю ссылку 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, оно загружается в так называемую процедуру.

Надеюсь, что это поможет.

Ответ 2

1. Первые два являются инструкциями, третий - особым регистром

  • jal = прыжок и ссылка (адрес следующей команды, помещенной в $ra, и переход к целевому адресу)
  • jr = перейти к указанию регистра
  • $ra = обратный адрес

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

  • jr $ra (Скопировать $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,$0,$t0   # it 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)

Ответ 3

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

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

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