Функции (процедуры) в MIPS
Я новичок в языке MIPS, и я не понимаю, как работают функции (процедуры) на языке ассемблера MIPS. Вот, но я укажу свою проблему:
Ответы
Ответ 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
).