Регистры и модель памяти
Вступление: понятие о конвециях
Регистры
Регистр |
Программное имя |
Регистр |
Программное имя |
r0 |
zero |
r16 |
s0 |
r1 |
at |
r17 |
s1 |
r2 |
v0 |
r18 |
s2 |
r3 |
v1 |
r19 |
s3 |
r4 |
a0 |
r20 |
s4 |
r5 |
a1 |
r21 |
s5 |
r6 |
a2 |
r22 |
s6 |
r7 |
a3 |
r23 |
s7 |
r8 |
t0 |
r24 |
t8 |
r9 |
t1 |
r25 |
t9 |
r10 |
t2 |
r26 |
k0 |
r11 |
t3 |
r27 |
k1 |
r12 |
t4 |
r28 |
gp |
r13 |
t5 |
r29 |
sp |
r14 |
t6 |
r30 |
s8, fp |
r15 |
t7 |
r31 |
ra |
Только два регистра особенные — zero (r0, всегда равен 0) и ra (r31, автоматически заполняется некоторыми командами)
Теоретически можно использовать любой, но это сильно затрудняет написание работающих программ
⇒ возникает понятие конвенции (договорённости)
Регистр at (r1) используется псевдоинструкциями (например, для адреса при косвенной адресации)
Регистры a0 - a3 (r4 - r7) используются для передачи параметров подпрограммам
- Очевидно, у подпрограмм может быть более 4 параметров, так что здесь тоже вступают в силу конвенции, и очень разнообразные
Регистры v0, v1 (r2, r3) используются для возврата значений (почему два?)
Регистры t0 - t9 (r8-r15, r24,r25) можно использовать без ограничений
Регистры s0 - s8 (r16 - r23, r30) по договорённости необходимо восстанавливать в исходные значения перед выходом из подпрограммы. При этом даже если они используются вне подпрограммы, код сохранения и восстановления обязан присутствовать.
Регистры k0, k1 (r26, r27) используются для взаимодействия с ядром
Регистр sp (r29) содержит ссылку на вершину стека (stack pointer)
Регистр gp (r28) хранит адрес области глобальных данных (global pointer). Нужен, например, для хранения «глобальных переменных», доступных в том числе и из подпрограмм (конвенция!), или для передачи данных со стороны операционной системы
Регистр s8 (r30) в некоторых конвенциях организации подпрограмм используется для хранения ссылки на область данных текущей подпрограммы, поэтому он носит ещё одно название — fp (frame pointer)
Ещё два регистра — HI и LO — используются в командах деления и умножения.