Код для передачи целого числа 9 в сопроцессор, получения максимального значения его квадратного корня, затем передачи этого значения обратно и вывода на печать:
addi $t1, $zero, 9
mtc1 $t1, $f0
sqrt.s $f0, $f0 # (*)
ceil.w.s $f0, $f0 # (*)
mfc1 $t0, $f0
addi $v0, $zero, 1
addi $a0, $t0, 0
syscall
Обратите внимание на строки с (*): (1) я также пробовал использовать .d вместо .s; (2) Я также пытался сделать разные регистры источника и назначения (от $f0
до $f2
и обратно).
Мой результат — 1 (если я возьму слово, то 0). Однако, если я закомментирую *-ed строки, 9 будет передано туда и сюда нормально: 9 будет напечатано.
Я добавил системный вызов «print_double» (= 3) после передачи (и перед передачей обратно в ЦП), чтобы распечатать переданное число, и печатается очень маленькое положительное число.
Мои вопросы:
а) Что происходит?
(b) mtc1
: целое число, переданное ЦП, получено как двойное или одинарное? Прежде чем отправить его обратно с mfc1
, он должен быть одинарным или двойным, или это не имеет значения? (экспериментировал с cvt.d.s
и т.п., безрезультатно)
Примечание: я делаю это для развлечения, используя «Компьютерную организацию и дизайн» (Паттерсон, Хеннесси). В 4-м издании неправильный синтаксис для mtc1
в приложении B.10 - порядок rd
и rs
должен быть таким, как указано выше.