Ассемблер MIPS/Функции

Материал из Викиучебника — открытых книг для открытого мира
Перейти к навигации Перейти к поиску
Функции в ассемблере MIPS

Любой человек, знакомый с программированием, знает о таком понятии, как подпрограмма. Функция - это подпрограмма, которая возвращает результат.

MIPS процессор имеет так называемые saved registers ($s0 - $s7) , которые предназначены для данных подпрограмм , если они вздумают использовать регистры. Это всего лишь правило хорошего кода для программистов, можно использовать любые другие регистры, процессору все равно. Допустим, мы хотим написать функцию для вычисления факториала. Назовем её FACTORIAL. Выстроим для неё каркас:

#...
jal FACTORIAL 
xor $t2,$t2,$t2
#...
FACTORIAL:
#...
jr $ra

Инструкция jal переходит на метку FACTORIAL и сохраняет в регистре $ra адрес возврата. С помощью jr мы переходим по адресу, содержащем в $ra и попадаем на инструкцию xor $t2,$t2,$t2 (которая обнуляет регистр $t2) . Наша функция будет принимать значение n и возвращать n! . Для параметров функций созданы регистры $a0 - $a3 . Наша функция займет $a2. Итак, перед вызовом функции в $a2 следует записать число, из которого будем вычислять факториал.

li $a2,10 
jal FACTORIAL

li - это даже не инструкция, а макрос. Загружает в регистр целое значение. О макросах будет сказано позже. Наша функция должна еще возвратить значение n! . Для возвращаемых значений функций предназначены регистры $v0 и $v1. Напишем полный код функции:

FACTORIAL:

 li $t1, 1
 li $t2, 1
 j loop

loop:

  mult $t1,$t2
  mflo $t1
  
  addiu $t2,$t2,1
  
  bgt $t2, $a2, endloop
  j loop
  
endloop:  
la $v1,($t1)
jr $ra

Как вы видите, для возвращаемого значения был выбран регистр $v1. Теперь, чтобы вывести результат, вы можете воспользоваться командой syscall.