Introdução à Arquitetura de Computadores
24 pág.

Introdução à Arquitetura de Computadores


DisciplinaNoções de Hardware31 materiais100 seguidores
Pré-visualização7 páginas
if Not Equal:
bne $r1, $r2, DESTINO
Ele funciona da mesma forma que o beq. A diferença é que ele pula um determinado número de instruções somente
se o valor dos dois registradores for diferente.
E finalmente, temos a instrução j, ou Jump:
j ENDEREÇO
Ele faz com que o programa passe a executar a instrução que é encontrada no endereço dado. O endereço passado
para a instrução j é sempre um número de 26 bits. Entretanto, os endereços da máquina sempre são números de 32
bits. Então como será possível saber qual o endereço em que está a instrução desejada?
É muito simples. Instruções sempre estarão em endereços múltiplos de 4. Então sabemos que os dois últimos bits do
endereço são sempre 0. Não precisamos armazená-los. Já os dois primeiros bits, retiramos do PC, pois é sempre
muito mais provável que nós usemos o controle de fluxo para saltar para uma posição não muito distante. Caso
precisemos saltar para um posição muito distante, basta alterarmos o valor do PC primeiro. Da mesma forma que foi
visto no beq, o caso comum executa mais rápido desta forma. Isso é muito bom, mesmo que tenhamos mais trabalho
e perda de desempenho nas pouquíssimas vezes nas quais precisamos dar saltos muito longos.
Instruções do MIPS 9
Instruções de Comparações
Por fim, precisamos ver ainda instruções de comparação. Um exemplo é o slt, ou Set Less Than:
slt $r1, $r2, $r3
Ela armazena 1 em $r1 se $r2 < $r3 e 0 caso contrário.
Resumo dos Modos de Endereçamento
Nas instruções do MIPS podemos representar os endereços de dados das seguintes formas:
\u2022 A Registrador: Representamos o dado passando o nome do registrador no qual ele está contido. Ex: add $r1,
$r2, $r2.
\u2022 Base-Deslocamento: Representamos o dado passando o endereço de um vetor no qual ele está e a quantidade de
bits a serem deslocados. Ex: lw $r5, 4($r65).
\u2022 Imediato: Passamos o dado escrevendo o seu valor imediato. Ex: addi $r1, $r2, 456.
\u2022 Relativo ao PC: Passamos o dado descrevendo o seu valor relativo ao endereço da instrução atual. Ex: beq $r1,
$r2, DESTINO.
\u2022 Absoluto: passamos o valor informando o seu endereço (pseudo-)absoluto. Ex: j DESTINO.
Existem apenas estas 5 formas de endereçamento no MIPS. Através delas, efetuamos todas as operações necessárias.
Referências
[1] http:/ / pages. cs. wisc. edu/ ~larus/ spim. html
Representação das Instruções
Sabemos que tudo dentro do computador é representado por meio de bits - que podem ter o valor de 0s e 1s. Até
mesmo as instruções de um processador MIPS. Vamos estudar agora como uma instrução é representada a nível de
bits. O MIPS reconhece 3 famílias diferentes de instruções. São elas:
As Instruções Tipo R
Como exemplo de instruções do tipo R vistas, temos: add, addu, sub, subu, or e and.
Elas são codificadas da seguinte forma:
[o][o][o][o][o][o] - [u][u][u][u][u] - [t][t][t][t][t] - [d][d][d][d][d] - [s][s][s][s][s] - [f][f][f][f][f][f]
Onde a letra &quot;o&quot;, representa o opcode, ou Código de Operação. Ele avisa mais-ou-menos o que a instrução vai fazer.
Por exemplo, uma instrução de soma add é muito semelhante à instrução xor que faz um XOR lógico bit-a-bit. A
única diferença é que na soma, devemos armazenar um bit a mais para representar o &quot;vai um&quot; quando somamos 1+1.
Logo, as duas instruções tem o mesmo opcode.
As letras &quot;u&quot; e &quot;t&quot; representam os operandos das instruções. Ou melhor, os registradores nos quais estão os
operandos.
A letra &quot;d&quot; é o registrador de destino onde deve ser armazenado o resultado.
A letra &quot;s&quot; ou Shampt representa o deslocamento de bits, ou seja um shift que pode se usado após a operação.
Finalmente, a letra &quot;f&quot; é o código de função. É por meio dela que diferenciamos instruções semelhantes que tem o
mesmo opcode, como add e or.
Representação das Instruções 10
As Instruções Tipo I
Como exemplo deste tipo de instrução, podemos citar todas aquelas que contam com um valor imediato, como addi,
subi, ori, beq e bnq.
Eles são codificados da seguinte forma:
[o][o][o][o][o][o] - [u][u][u][u][u] - [t][t][t][t][t] - [i][i][i][i][i][i][i][i][i][i][i][i][i][i][i][i]
A letra &quot;o&quot; representa o código da instrução. A letra &quot;u&quot; represeenta o número do registrador onde a o resultado da
operação é colocado. Já a letra &quot;t&quot; representa o número do registrador em que está um dos operandos. Já o &quot;i&quot;
representa o número imediato. Agora vemos o porquê do valor passado como imediato nunca poder exceder os 16
bits.
As Instruções Tipo J
A única instrução vista no capítulo anterior do tipo J é a j. Ela é codificada da seguinte forma:
[o][o][o][o][o][o] - [d][d][d][d][d][d][d][d][d][d][d][d][d][d][d][d][d][d][d][d][d][d][d][d][d][d]
O &quot;o&quot; representa o código da operação j e d representa o destino.
As Pseudo-Instruções
A linguagem Assembly de uma máquina costuma ser um reflexo direto de como são implementadas as instruções de
um determinado processador. Entretanto, nem todas as instruções que temos à disposição quando programamos em
Assembly são instruções verdadeiras para o processador. Algumas delas são na verdade pseudo-instruções.
Pseudo-instruções costumam ser substituídas pelo montador ao gerar instruções para o computador na forma de
Lingüagem de Máquina. Pseudo-Instruções são na verdade combinações de mais de uma instrução. Vejamos agora
alguns exemplos:
A Pseudo-Instrução move
move $r1, $r2 # Copia o conteúdo do registrador $r2 para $r1
Ela é na verdade implementada da seguinte forma:
addu $r1, $r0, $r2 # Soma $r2 com zero e coloca o resultado em $r1
O registrador $r0 usado acima não é um registrador comum. Ele sempre possui o valor &quot;0&quot; e é um dos poucos
registradores cujo valor nunca pode ser alterado pelo programador.
As Pseudo-Instruções 11
A Pseudo-Instrução Load Address
la $r1, ENDEREÇO # Coloca o valor numérico de 32 bits &quot;ENDEREÇO&quot; em $r1
Esta instrução é muito útil para fazeer registradores receberem o valor de ponteiros para outros locais de memória.
De fato, usamos esta pseudo-instrução no Capítulo anterior quando convertemos um código em C para o Assembly
do MIPS. Ela é na verdade implementada desta forma:
lui $r1, constHI # Carrega-se os 16 bits mais significativos em $r1
ori $r1, $r0, constLO # Executa-se um OR bit-a-bit entre o registrador
 # com os 16 bits mais significativos e os 16 bits
 # menos significativos
O que a instrução lui, ou Load Upper Immediate faz é uma operação shift de 16 bits para a esquerda e coloca no
registrador indicado. Este passo é necessário porque valores imediatos passados para instruções só podem ter 16 bits
por causa da limitação de espaço das instruções do Tipo I.
Também existe a instrução li, ou Load Immediate que faz exatamente a mesma coisa que o la.
Note que o montador que remove as pseudo-instruções e as substitui por instruções que realmente existem no
hardware sempre podem verificar se o valor que queremos carregar no registrador cabe em 16 bits. Neste caso, a
instrução gerada fica bem mais simples e rápida:
addu $r1, $r0, $r2 # Soma $r2 com 0 e coloca em $r1
Suporte à Funções
Funções são ferramentas muito importantes, pois tornam código escrito muito mais usável e torna a tarefa de
programar mais produtiva. Elas permitem que um programador se concentre em apeenas uma tarefa de cada vez.
Portanto, é essencial que um processador possua suporte á elas. Veremos como isso ocorre no MIPS.
As Etapas Necessárias para Invocar Funções
Quando queremos chamar uma função, as seguintes etapas devem ser cumpridas:
\u2022\u2022 O programa principal deve colocar os parâmetros da função em um local que ela possa acessar.
\u2022\u2022 O programa principal deve ceeder o controle para a função.
\u2022\u2022 A função deve coletar todos oos parâmetros deixados pelo programa principal.
\u2022\u2022 A função deve executar a tarefa desejada.
\u2022\u2022 A função deve aramazenar seus resultados em um lugar em que o programa principal possa acessar.
\u2022\u2022 A função deve retornar o fluxo do código para