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
Figura: 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 ...