Инструменты пользователя

Инструменты сайта


cpu

Это старая версия документа!


CPU

Центральным процессором PlayStation является MIPS R3000, 32-битный RISC-микропроцессор, реализующий ISA MIPS I.

Регистры

R3000 имеет 32 регистра общего назначения:

  • $0 - r0 - всегда равен нулю
  • $1 - at - временные данные для некоторых псевдоинструкций ассемблера
  • $2..$3 - v0..v1 - возвратные значения процедур
  • $4..$7 - a0..a3 - аргументы процедур
  • $8..$15 - t0..t7 - переменные
  • $16..$23 - s0..s7 - статические переменные процедур
  • $24..$25 - t8..t9 - переменные
  • $26..$27 - k0..k1 - зарезервированы для BIOS
  • $29 - sp - стековый указатель. Содержит первый свободный адрес на стеке
  • $31 - ra - адрес возврата. Переход по этому адресу осуществляет возврат из процедуры.

Особые регистры:

  • hi, lo - результат целочисленного умножения/деления (верхняя и нижнняя части)
  • pc - программный счетчик.

O32 ABI:

  • $2..$3 (v0..v1) - возвратные значения
  • $4..$7 (a0..a3) - аргументы
  • $29 - указатель на стек
  • $31 - адрес возврата.

Если функция использует более 4 32-битных аргументов, 5-й аргумент и далее кладутся на стек.

Инструкции

Арифметика:

  • add $r, $a, $b - сложение. $r = $a + $b
  • addu $r, $a, $b - беззнаковое сложение. $r = $a + $b
  • addi $r, $a, imm - сложение с константой. $r = $a + imm
  • addiu $r, $a, imm - беззнаковое сложение с константой. $r = $a + imm
  • sub $r, $a, $b - вычитание. $r = $a - $b
  • subu $r, $a, $b - беззнаковое вычитание. $r = $a - $b
  • mult $a, $b - умножение. $a * $b
  • multu $a, $b - беззнаковое умножение. $a * $b
  • div $a, $b - деление. $a / $b
  • divu $a, $b - беззнаковое деление. $a / $b

Сравнение:

  • slt $r, $a, $b - проверка условия «меньше». $r = (int)$a < (int)$b
  • slti $r, $a, imm - проверка условия «меньше» с константой. $r = (int)$a < imm
  • sltiu $r, $a, imm - беззнаковая проверка условия «меньше» с константой. $r = $a < imm

Побитовые операции:

  • and $r, $a, $b - побитовое «И». $r = $a & $b
  • andi $r, $a, imm - побитовое «И» с константой. $r = $a & imm
  • or $r, $a, $b - побитовое «ИЛИ». $r = $a | $b
  • ori $r, $a, imm - побитовое «ИЛИ» с константой. $r = $a | imm
  • xor $r, $a, $b - исключающее «ИЛИ». $r = $a ^ $b
  • nor $r, $a, $b - отрицающее «ИЛИ». $r = !($a | $b)
  • sll $r, $a, imm - логический сдвиг влево на константное значение. $r = $a « imm
  • sllv $r, $a, $b - логический сдвиг влево на переменное значение. Значение сдвига маскируется на 5 бит. $r = $a « ($b & 0x1f)
  • slr $r, $a, imm - логический сдвиг вправо на константное значение. Верхние биты результата заполняются нулями. $r = $a » imm
  • srlv $r, $a, $b - логический сдвиг вправо на переменное значение. Верхние биты результата заполняются нулями. Значение сдвига маскируется на 5 бит. $r = $a » ($b & 0x1f)
  • sra $r, $a, imm - арифметический сдвиг вправо на константное значение. Верхние биты результата заполняются битом знака входного значения. $r = (int)$a » imm
  • srav $r, $a, $b - арифметический сдвиг вправо на переменное значение. Верхние биты результата заполняются битом знака входного значения. Значение сдвига маскируется на 5 бит. $r = (int)$a » ($b & 0x1f)

Чтение и запись памяти:

Внимание! Инструкции доступа к оперативной памяти требуют выровненные адреса. Доступ к слову (word) требует выравнивание по 4 байта, доступ к полуслову (half-word) требует выравнивание по 2 байта. Использование невыровненных адресов приведет к исключению шины.

  • lw $r, imm($a) - загружает слово. $r = $a + imm
  • lh $r, imm($a) - загружает полуслово. $r = $a + imm
  • lhu $r, imm($a) - загружает беззнаковое полуслово. $r = $a + imm
  • lb $r, imm($a) - загружает байт. $r = $a + imm
  • lbu $r, imm($a) - загружает беззнаковый байт. $r = $a + imm
  • lwl $r, imm($a) - загружает старшие байты слова по невыровненному адресу
  • lwr $r, imm($a) - загружает младшие байты слова по невыровненному адресу
  • sw $r, imm($a) - сохраняет слово. $a + imm = $r
  • sh $r, imm($a) - сохраняет полуслово. $a + imm = $r
  • sb $r, imm($a) - сохраняет байт. $a + imm = $r
  • lui $r, imm` - загружает константу в старшие 16 бит слова

Инструкции загрузки не останавливают исполнение программы до тех пор, пока данные не будут доступны. Поэтому, если следующая инструкция зависит от загруженных данных, необходимо вставить слот задержки.

Безусловный переход:

  • j imm - безусловный переход по константному адресу
  • jr $r - безусловный переход по переменному адресу
  • jal imm - безусловный переход по константному адресу с сохранением адреса возврата в $31
  • jalr $r - безусловный переход по переменному адресу с сохранением адреса возврата в $31
  • jalr $r, $a - двухадресная форма jalr. Позволяет задать регистр для сохранения адреса возврата
cpu.1784288063.txt.gz · Последнее изменение: gecko

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC0 1.0 Universal
CC0 1.0 Universal Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki