Em um computador, a execução de suas funções típicas (como carregar e executar processos), envolvem unidades funcionais que compôem o hardware, como codificadores, decodificadores, multiplexadores e etc. Os quais, envolvem uma manipulação de baixo nível, os bits.
Estes comandos executáveis, são manipulados pela linguagem ASSEMBLY, a qual representa as intruções de linguagem de máquina, em um nível mais compreensivo.
Outra questão a ser analisada, é sobre o conceito de programa armazenado, onde programas ~soa executados sequêncialmente pelo processador.
Sendo um microprocessador sem estágios de bloqueio pipeline, onde foi um dos primeiros processadores de computador com conjunto de instruções reduzido. Além de serem caracterizados por um grande número de registradores.
A execução de uma instrução por um processador MIPS pode ser dividida em 5 fases, sendo elas busca, decodificação, execução, acesso a memória e retorno.
Entenda que essas linguagens passam por uma certa hierarquia até sua execução, partindo de linguagem de alto nível(Ling. C), para linguagem de baixo nível(ASSEMBLY) e finalmente para linguagem de máquina. Além disso, esses dados seguem um ciclo de instruções, onde ocorre:
OBS: PC são registradores que apontam para a próxima instrução dentro do programa.
Instruções são palavras de linguagem de máquina, logo, um conjunto de instruções (como um script) é chamado de ISA (Instruction Set Architeture). Por exemplo:
C++ | MIPS ----------------------- -> a = b + c; | -> add a,b,c -> d = a - c; | -> sub d,a,c Ou, de forma mais complexa: C++ | MIPS ----------------------- -> f = (g+h) - (i+j);| -> add t0,g,h | -> add t1,i,j | -> sub f,t0,t1
Perceba que em uma linguagem MIPS,apenas uma operação pode ser realizada por vez, sendo preciso até mesmo o uso de registradores para o armazenamento para futuras operações.
Diante disso, o MIPS pode possuir inúmeros comandos de execução de instruções, sendo os principais:
Deslocamento de bits de acordo com a posição exigida.
sll $2, $5, 2 onde o registrador 2 recebe o registrador 5 deslocado 2 posições pra esquerda ($5*4).
Soma/Subtração de dois valores
add/sub $2, $4, $2 onde o registrador 2 recebe a soma/subtração dos registradores 4 e 2.
Leitura do endereço de algum registrador.
lw $15, 0($2) onde será inserido no registrador 15 o endereço do registrador 2, onde o 0 é a posição do endereço (de 4 em 4).
São os comandos que executam a movimentação dos dados entre a memória/registrador, onde:
Ou load, é o comando que realiza o movimento da memória para um regstrador.
Ou store, é o que realiza o movimento do registrador para a memória.
No MIPS, a memória é organizada em bytes, embora o endereçamento seja em palavras de 4 bytes (32 bits). Suponha que H seja associado com o registrador $s2 e o endereço base do array A armazenado em $s3. Qual o código MIPS para o comando A[12]=H+A[8]?
- lw $s0,32($s3)
- add $t0,$s2,$s0
- sw $t0,48($s3)
| OP | RS | RT | RD | Shamt | Funct | ------------------------------------- | 6B | 5B | 5B | 5B | 5B | 6B |
| OP | RS | RT | Endereço | ------------------------------------- | 6B | 5B | 5B | 16B |
Possui instruções aritméticas e instruções load/store, onde o endereçamento é o deslocamento ao enderço base em RS.
| OP | Endereço | ------------------------------------- | 6B | 26B |
Instruções de desvio incondicional.
Para a realização de um tipo de formato (R, J ou i) é preciso uma tabela para um melhor entendimento, chamada de MIPS Reference Data, a qual contêm todos os comandos e seus tipos de instrução assim como identificar o opcode/funct dos mesmos. Uma instrução add por exemplo, possui um tipo R, com opcode/funct 0/20 (hexadecimal), logo, para uma conversão hexadecimal é preciso completar as caixas da tabela do tipo com números binários e depois converte-los para hexadecimla, como no exemplo a seguir:
add $t0,$s1,$s2 | OP | RS | RT | RD | Shamt | Funct | ------------------------------------- | 0 | $s1 | $s2 | $t0 | 0 | add | Logo, cada caixa irá possuir um valor binário (respeitando a quantidade de bits de cada uma), onde:00000010001100100100000000100000 Esses bits devem ser separados em grupos de 4 para a conversão: 0000|0010|0011|0010|0100|0000|0010|0000 ^ ^ ^ ^ ^ ^ ^ ^ 0 | 2 | 3 | 2 | 4 | 0 | 2 | 0 0x02324020
- add - 100000
- shamt - 00000
- $t0 - 01000
- $s2 - 10010
- $s1 - 10001
- OP - 000000
Existem aspectos que podem causar uma mudança no desempenho da CPU, como a quantidade de instrução (a qual é determinada pela ISA e compilador) e o CPI/Tempo de ciclo (determinado pelo hardware da CPU).
Inúmeras instruções podem ser dadas no MIPS, sendo as mais comuns divididas em 3 subconjuntos, referência de memória (Lw,Sw), lógico/aritmético (add, sub, and, or) e transferência de controle (beq, j).
Para todas as intruções, os dois primeiros passos são iguais, sendo: fetch instruction (PC -> memória da instrução), onde deve enviar o PC (registrador) para a memória e buscar a instrução. Além do
Estes processos, são construídos em um simulador, chamado de Logisim, este simulador possui duas unidades principais:
Componente do processador que realiza operações aritméticas.
Componente do precessador que comanda o datapath, memória e dispositivos de I/O de acordo com as instruções de um programa.
Os passos seguintes dependem da classe, que utilizam da ULA após a leitura de um rgistrador. Após o uso da ULA, os passos são diferentes para cada classe.
São necessários alguns dispositivos para a sua implementação, como:
Possuem estrutura de registradores, com 32 bits, chamados também de register files, sendo um conjunto de registradores que podem ser acessados (lidos ou escritos) especificando seu número. Nele se encontram o registrador de estado da máquina.
Costumam possuir 3 operandos de registradores (add $t1,$t2,$t3). Para ter um dado do register file, é preciso de uma entrada (número do registrador) e uma saída (o dado lido). Já para escrever um dado, são necessárias duas entradas: o número do registrador e o dado a ser escrito (sinal de controle RegWrite). Por fim, a ULA é controlada por um sinal de controle.
datapath para instruções do tipo R