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

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


cpu

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
cpu [2026/07/17 11:24] geckocpu [2026/07/17 12:48] (текущий) gecko
Строка 1: Строка 1:
 ====== CPU ====== ====== CPU ======
-Процессором PlayStation является MIPS R3000, 32-битный RISC-микропроцессор, реализующий ISA MIPS I.+Центральным процессором PlayStation является MIPS R3000, 32-битный RISC-микропроцессор, реализующий ISA MIPS I.
  
 ===== Регистры ===== ===== Регистры =====
Строка 31: Строка 31:
 ===== Инструкции ===== ===== Инструкции =====
  
-Арифметика:+**Арифметика:**
   * add $r, $a, $b - сложение. $r = $a + $b   * add $r, $a, $b - сложение. $r = $a + $b
   * addu $r, $a, $b - беззнаковое сложение. $r = $a + $b   * addu $r, $a, $b - беззнаковое сложение. $r = $a + $b
Строка 43: Строка 43:
   * divu $a, $b - беззнаковое деление. $a / $b   * divu $a, $b - беззнаковое деление. $a / $b
  
-Сравнение:+**Сравнение:**
   * slt $r, $a, $b - проверка условия "меньше". $r = (int)$a < (int)$b   * slt $r, $a, $b - проверка условия "меньше". $r = (int)$a < (int)$b
   * slti $r, $a, imm - проверка условия "меньше" с константой. $r = (int)$a < imm   * slti $r, $a, imm - проверка условия "меньше" с константой. $r = (int)$a < imm
   * sltiu $r, $a, imm - беззнаковая проверка условия "меньше" с константой. $r = $a < imm   * sltiu $r, $a, imm - беззнаковая проверка условия "меньше" с константой. $r = $a < imm
  
-Побитовые операции:+**Побитовые операции:**
   * and $r, $a, $b - побитовое "И". $r = $a & $b   * and $r, $a, $b - побитовое "И". $r = $a & $b
   * andi $r, $a, imm - побитовое "И" с константой. $r = $a & imm   * andi $r, $a, imm - побитовое "И" с константой. $r = $a & imm
Строка 62: Строка 62:
   * srav $r, $a, $b - арифметический сдвиг вправо на переменное значение. Верхние биты результата заполняются битом знака входного значения. Значение сдвига маскируется на 5 бит. $r = (int)$a >> ($b & 0x1f)   * srav $r, $a, $b - арифметический сдвиг вправо на переменное значение. Верхние биты результата заполняются битом знака входного значения. Значение сдвига маскируется на 5 бит. $r = (int)$a >> ($b & 0x1f)
  
-Чтение и запись:+**Чтение и запись памяти:**
  
 **Внимание!** Инструкции доступа к оперативной памяти требуют выровненные адреса. Доступ к слову (word) требует выравнивание по 4 байта, доступ к полуслову (half-word) требует выравнивание по 2 байта. Использование невыровненных адресов приведет к исключению шины. **Внимание!** Инструкции доступа к оперативной памяти требуют выровненные адреса. Доступ к слову (word) требует выравнивание по 4 байта, доступ к полуслову (half-word) требует выравнивание по 2 байта. Использование невыровненных адресов приведет к исключению шины.
  
   * lw $r, imm($a) - загружает слово. $r = $a + imm   * lw $r, imm($a) - загружает слово. $r = $a + imm
-  * lh $r, imm($a) - загружает полуслово. `$r = $a + imm` +  * lh $r, imm($a) - загружает полуслово. $r = $a + imm 
-  * lhu $r, imm($a) - загружает беззнаковое полуслово. `$r = $a + imm` +  * lhu $r, imm($a) - загружает беззнаковое полуслово. $r = $a + imm 
-  * lb $r, imm($a) - загружает байт. `$r = $a + imm` +  * lb $r, imm($a) - загружает байт. $r = $a + imm 
-  * lbu $r, imm($a) - загружает беззнаковый байт. `$r = $a + imm`+  * lbu $r, imm($a) - загружает беззнаковый байт. $r = $a + imm
   * lwl $r, imm($a) - загружает старшие байты слова по невыровненному адресу   * lwl $r, imm($a) - загружает старшие байты слова по невыровненному адресу
   * lwr $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. Позволяет задать регистр для сохранения адреса возврата
 +
 +**Условный переход (ветвление):**
 +  * beq $r, $a, imm - переход по константному адресу при равенстве операндов
 +  * bne $r, $a, imm - переход по константному адресу при неравенстве операндов
 +  * bgez $r, imm - переход по константному адресу, если операнд больше или равен нулю
 +  * bltz $r, imm - переход по константному адресу, если операнд меньше нуля
 +  * bgezal $r, imm - переход по константному адресу, если операнд больше или равен нулю, с сохранением адреса возврата в $31
 +  * bltzal $r, imm - переход по константному адресу, если операнд меньше нуля, с сохранением адреса возврата в $31
 +
 +**Псевдоинструкции:**
 +
 +  * li $r, imm - загружает 32-битную константу. Если значение длиннее 16 бит, инструкция транслируется в lui и ori. Если значение умещается в 16 бит и не имеет знака, транслируется в ori. Если значение умещается в 16 бит и имеет знак, транслируется в addiu с нулевым первым операндом
 +  * nop - то же самое, что sll $0, $0, 0 (такой вариант удобен тем, что в машинном коде выглядит как 0x00000000). Инструкция-филлер, известная также как "слот задержки".
cpu.1784287446.txt.gz · Последнее изменение: gecko

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