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

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

  1. Что значит:

    • jal
    • jr
    • $ra

    означает на языке mips и главное

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

person Sneimeh    schedule 17.11.2010    source источник
comment
Это проблема с домашним заданием? Статья в Википедии (en.wikipedia.org/wiki/MIPS_architecture#MIPS_assembly_language) объясняет jal и jr, возможно, это ответ на ваш вопрос.   -  person Heatsink    schedule 17.11.2010


Ответы (4)


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

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

person Mihai Scurtu    schedule 18.11.2010
comment
Большое спасибо, чувак, это очень помогает, и ссылка также - person Sneimeh; 18.11.2010

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'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)
person pohchen    schedule 06.04.2011

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

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

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

person Thomas Pornin    schedule 18.11.2010

  • jal: aka jump and link against any function name will redirect you to the required function.
  • jr $ ra: возвращает значение из вызванной функции.

основная функция:

   .data

            x: .word 3                        # initializing x to be 3
            y: .word 5                        # initializing y to be 5
            answer: .word 0                   # intialzing answer to be 0
            prompt: .asciiz "Add X to Y: "    # console prompt for final answer

   .text

   .globl main

   .ent main

    main:

             lw $a0, x                         # pass arguments to function $a0 - x, $a1 - y
             lw $a1, y
             jal adds                          # adds function is called
             sw $v0, answer                    # answer from the returned value

             la $a0, prompt                    # displaying prompt on the console
             li $v0, 4
             syscall

             lw $a0, answer                    # displaying final answer on the console
             li $v0, 1
             syscall

             li $v0, 10                        # end program
             syscall

    .end main

добавляет функцию:

    .globl adds

    .ent adds

    adds:                                      # adds function

              li $v0, 0                                          
              add $v0, $a0, $a1                # adding arguments to the callee
              jr $ra                           # return

   .end adds
person Saba    schedule 27.03.2021