Как я могу передать числа с плавающей запятой через $ a0 в MIPS? - PullRequest
0 голосов
/ 29 марта 2019

Я пишу библиотеку MIPS, в которой я планирую передать все аргументы через $aX регистры и вернуть все значения через $vX регистры.

Я написал следующую функцию:

# PrintFloat - prints a float
# arguments:
#   $a0 = arress of the float
# return value:
#   n/a
PrintFloat: 
    move $f12, $a0
    li $v0, 2
    syscall
    # return 
    jr $ra 

эта функция не компилируется в MARS.

У меня есть три вопроса здесь:

  1. Разве нельзя пропустить поплавки через $a регистры вообще?
  2. Стоит ли проектировать библиотеку для передачи аргументов через $sp (использование $sp сравнительно грязно)?
  3. Нужно ли создавать стековые фреймы в каждой тривиальной функции, подобной этой, чтобы сделать ее небезопасной?

1 Ответ

3 голосов
/ 29 марта 2019

Разве нельзя передавать поплавки через регистры $ a?

Это возможно. Но в MIPS FP рассматривается как сопроцессор по историческим причинам, и вы должны использовать специальную инструкцию для копирования данных перемещения между процессором и сопроцессором: MFC (перемещение из сопроцессора) и MTC (перемещение в сопроцессор). Блок FP - это сопроцессор 1, и соответствующие инструкции: mfc1 и mtc1.

mfc1 rt, fs  # copy data from fp register fs to gp register rt

Аналогично для копирования в регистр fp используйте mtc1

mtc1 rs, ft  # copy data from gp register rs to fp register ft

Так что вам просто нужно использовать

mfc1 $a0, $f12

чтобы положить $ f12 в $ a0.

Должен ли я спроектировать библиотеку так, чтобы вместо нее передавались аргументы через $ sp (использование $ sp довольно грязно)?

Нет, это бесполезно, если у вас нет большого количества аргументов.

Нужно ли создавать стековые фреймы в каждой тривиальной функции, подобной этой, чтобы сделать ее небезопасной?

Нет. Но стековые фреймы, конечно, необходимы, если вам нужно сохранить регистры в вызывающей или вызываемой. И сохранить $ ra, если ваша функция вызывает другую функцию.

...