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

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

16 голосов
/ 17 ноября 2010

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

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

    • jal
    • jr
    • $ra

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

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

Ответы [ 3 ]

20 голосов
/ 18 ноября 2010

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

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

10 голосов
/ 06 апреля 2011

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)
2 голосов
/ 18 ноября 2010

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

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

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

...