Arquitectura de Computadores
Notas de estudo
Alberto José Proença
1998/99
Anexo C: Descrição do MIPS R2000

Figura: MIPS R2000 - CPU e FPU
1.2 Registos
CPU
A tabela apresenta a convenção para o uso dos registos que garante a compatibilidade entre módulos desenvolvidos por diferentes programadores.
| Registo | Número | Uso | 
| ra | 31 | Endereço de retorno de procedimentos | 
| zero | 0 | Constante 0 | 
| at | 1 | Reservado ao assembler | 
| v0-v1 | 2-3 | Expressões e resultados de funções | 
| a0-a3 | 4-7 | Argumentos 1 - 4 | 
| t0-t7 | 8-15 | Valores temporários a descartar | 
| s0-s7 | 16-23 | Valores temporários a preservar | 
| t8-t9 | 24-25 | Valores temporários a descartar | 
| k0-k1 | 26-27 | Reservados ao S.O. (kernel) | 
| gp | 28 | Apontador para a área global de dados | 
| sp | 29 | Apontador para a pilha | 
| fp | 30 | Apontador para a estrutura | 
| ra | 31 | Endereço de retorno | 
Tabela: Convenções para uso dos registos do MIPS
Há ainda dois registos especiais associados às operações de multiplicação / divisão. Estes só podem ser acedidos através de 4 instruções específicas que transferem informação entre esses registos (HI e LO) e qualquer um dos 32 registos ($0 a $31).
O SPIM simula os registos do coprocessador 0 necessários para a gestão de excepções.
| Registo | Número | Uso | 
|---|---|---|
| BadVAddr | 8 | Endereço de memória onde ocorreu a excepção | 
| Status | 12 | Máscara de interrupções e bits de activação | 
| Cause | 13 | Tipo de excepção e bits de interrupção pendentes | 
| EPC | 14 | Endereço da instrução que desencadeou a excepção | 
Tabela: Nomes dos registos do coprocessador 0 do MIPS
Coprocessador 1 - Processador de vírgula flutuante
O acesso aos registos do coprocessador 1 para
        cálculos em vírgula flutuante, precisão simples ou dupla, é através do número do
        registo precedido pela letra f. 
        Note que para manipular valores v.f. prec. simples estão disponíveis os 32 registos.
        Para manipular valores v.f. prec. dupla apenas 16 registos estão disponíveis ($f0, $f2,
        $f4, ..., $f30). Internamente cada um destes registos está associado ao seguinte para
        formarem um "registo" de 64 bits. 
          
| Registo | Número | Usos | 
| $f0 - $f31 | 0 - 31 | 32 registos genéricos para guardar valores em vírgula flutuante - precisão simples (32 bits) | 
| $f0 - $f30 | 0 - 30 | 16 pares de registos (ex. $0 e $1) para guardar valores em vírgula flutuante - precisão dupla (64 bits) | 
Tabela: Nomes dos registos do coprocessador 1 do MIPS
1.3 Ordem dos Octetos
 O mais significativo à frente
     
            O mais significativo à frente O menos significativo à frente
     O menos significativo à frenteFigura: Organização da Memória
intermédia - segmento de dados (0x1000 0000)
topo - a pilha inicia-se em (0x7fff ffff) e cresce em direcção ao segmento de dados.
3. Características MIPS / SPIM
3.1 MIPS
3.1.2 Ao nível da Máquina Virtual
3.2. SPIM
spim(1)                                                  
            spim(1)
            
            NAME
                   xspim - A MIPS R2000/R3000 Simulator
            
            SYNTAX
                   xspim    
            [-asm/-bare     -trap/-notrap    -quiet/-noquiet
                   -mapped_io/-nomapped_io -file file -execute file
                   -stext size -sdata size  -sstack size -sktext
            size -skdata
                   size -ldata size -lstack size -lkdata size
                   -hexgpr/-nohexgpr -hexfpr/-nohexfpr]
            
            DESCRIPTION
                   SPIM  S20  is  a simulator that runs
            programs for the MIPS
                   R2000/R3000 RISC computers. (For a description of the
            real
                   machines,  see  Gerry  Kane 
            and  Joe  Heinrich, MIPS RISC
                   Architecture, Prentice Hall,  1992.) 
            SPIM  can  read  and
                   immediately  execute files containing assembly
            language or
                   MIPS executable files.  SPIM is  a 
            self-contained  system
                   for  running  these  programs 
            and contains a debugger and
                   interface to a few operating system services.
Figura: Interface XSPIM.
| Comando | Descrição | 
| Quit | Abandonar o simulador | 
| load | Ler um ficheiro assembly ou executável para a memória. | 
| run | Iniciar a execução do programa. | 
| step | Executar passo-a-passo. | 
| clear | Reiniciar os valores dos registos ou da memória. | 
| set value | Atribuir valores aos registos ou à memória. | 
| Mostrar o valor dum registo ou duma posição de memória. | |
| breakpoint | Definir, apagar ou mostrar pontos de paragem. | 
| help | Mostrar a mensagem de ajuda. | 
| terminal | Mostrar ou esconder a consola do programa. | 
| mode | Estabelece os modos de operação do simulador | 
3.3 SPIM versus MIPS
- identificadores - cadeia de caracteres alfanuméricos (_) e (.), não iniciada por um algarismo;
- instruções - símbolos reservados que não podem ser usados como identificadores);
- etiquetas - identificadores declarados no início de uma linha e terminados por (:);
- cadeia de caracteres - definidas entre aspas (") seguindo a convenção:
- \n - nova linha;
\t - tabulador;
\'' - aspas;
\\ - barra invertida.
O SPIM contempla um subconjunto de directivas do assembler do MIPS:
O SPIM não faz qualquer distinção entre as directivas (.data, .rdata, and .sdata).
| .text <addr> | Se estiver presente o argumento addr o segmento de texto inicia no endereço addr. | 
| .ktext <addr> | Os próximos itens (instruções ou palavras) são incluídos no segmento de texto. Idêntica à anterior para o segmento de texto do Kernel. | 
| .data <addr> | Os próximos itens são incluídos no segmento de dados. Se estiver presente o argumento addr o segmento de dados inicia no endereço addr. | 
| .kdata <addr> | Idêntica à anterior para o segmento de dados do Kernel. | 
| .globl sym | Declara sym como um símbolo global que também pode ser referenciado noutros ficheiros. | 
| .extern sym size | Declara a estrutura de dados declarada sym como um símbolo global que tem n size octetos de comprimento. Sugere que aquela estrutura seja colocada numa posição de memória acessível através do registo $gp. | 
| .align n | Alinhamento dos dados em quadros
        de 2n octetos. 1 - meia palavra
        (dois octectos );  | 
| .ascii str | A cadeia de caracteres não terminada pelo caracter zero é guardada sequencialmente na memória. | 
| .asciiz str | Idêntica à anterior com a cadeia de caracteres terminada pelo caracter zero. | 
| .byte b1,...,bn | Guarda os n octectos sequencialmente na memória. | 
| .space n | Aloca n octectos de espaço no segmento de dados. | 
| .half h1,...,hn | Guarda os n valores de 16-bits ( meia palavra ) sequencialmente na memória. | 
| .word w1,...,wn | Guarda os n valores de 32-bits ( palavras ) sequencialmente na memória. | 
| .float f1,...,fn | Guarda os n valores em vírgula flutuante ( precisão simples ). | 
| .double d1,...,dn | Guarda os n valores em vírgula flutuante ( precisão dupla ). | 
.data item: .word 1 .text main: lw $t0, item # coloca 1 no registo $t0
5. Referências ...