Introdução à Arquitetura de Computadores/Instruções do MIPS: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Sem resumo de edição
Sem resumo de edição
Linha 49:
 
== Instruções de Uso de memória ==
 
As instruções do uso da memória seguem uma lógica diferente das instruções de operações aritméticas. Pra começar, existem três tipos de instruções capazes de copiar dados da memória para os registradores.
 
lw $r1, 4($r2) # Load Word: Esta instrução carrega uma palavra (estrutura de 4 bits)
# localizada no endereço representado pela soma do valor
# armazenado no registrador $r2 mais 4. O resultado é armazenado em $r1.
lh $r1, 6($r3) # Load Half: Esta instrução carrega uma estrutura de 2 bits localizada
# no endereço representado pela soma do valor armazeado no
# registrador $r3 mais o número 6. O resultado é armazenado em $r1.
lb $r1, 16($r2)# Load Byte: Esta instrução carrega um byte (8 bits) localizado no
# endereço representado pela soma do valor armazenado em $r2 mais o
# número 16. O resultado é armazenado em $r1.
 
Perceba que desta forma é rápido de carregar o conteúdo de um valor em um vetor. Basta saber o endereço do valor inicial do vetor e o índice de sua posição. Por exemplo, suponha que eu possua um vetor de caracteres '''char vetor[5]'''. Supondo que o registrador $r1 contenha o endereço de vetor[0], para armazenar o valor de vetor[3] no registrador $r2 e assumindo que cada caractere possui um byte, basta usar a seguinte instrução:
 
lb $r2 24($r1)
 
Colocamos o 24 lá porque cada caractere ocupa 8 bits e queremos pegar o quarto caractere da seqüência. Logo, precisamos nos deslocar 24 bits para acharmos o caractere certo. Afinal, a distância entre o primeiro elemento do vetor armazenado em $r1 e o quarto item do vetor é de 24:
 
[0][ ][ ][ ][ ][ ][ ][ ].[1][ ][ ][ ][ ][ ][ ][ ].[2][ ][ ][ ][ ][ ][ ][ ].[3][ ][ ][ ][ ][ ][ ][ ]
 
Para armazenarmos conteúdo de um registrador na memória também existem 3 comandos:
 
sw $r1, 4($r2) # Store Word: Esta instrução carrega uma palavra (estrutura de 4 bits)
# localizada no registrador $r1 e armazena no endereço representado
# pela soma do valor armazenado no registrador $r2 mais 4.
sh $r1, 4($r2) # Store Half: Esta instrução carrega uma estrutura de 2 bits
# localizada no registrador $r1 e armazena no endereço representado
# pela soma do valor armazenado no registrador $r2 mais 4.
sb $r1, 4($r2) # Store Byte: Esta instrução carrega um byte (8 bits)
# localizado no registrador $r1 e armazena no endereço representado
# pela soma do valor armazenado no registrador $r2 mais 4.
 
Vamos ver um exemplo de conversão de um código escrito em C para a lingüagem Assembly do MIPS assumindo que um '''int''' da lingüagem C tenha 4 bits:
 
/* CÓDIGO C */
typedef struct A{
int x;
int y;
int z;
int w;
}aType;
aType V[16];
(...)
aPtr = &(V[3]);
m = aPtr -> y;
n = aPtr -> w;
aPtr -> x = m + n;
 
Vamos assumir que o vetor V esteja no endereço 0x0800.0000. A estrutura aType é formada por 4 valores numéricos consecutivos, cada um com 4 bits. Logo, cada aType ocupa 16 bits (4*4). Ou, em hexadecimal, 0x010 bits. Veja uma representação de um aType como é armazenado na memória:
 
[x][x][x][x][y][y][y][y][y][z][z][z][z][w][w][w][w]
 
Temos um vetor com 16 estruturas como esta chamado V. Logo, o vetor ocupa um espaço de 256 bits. Com estas informações, concluímos que o código em Assembly necessário para fazer a operação mostrada no código em C mostrado acima é:
 
la $r1, 0x0800.0030 # A instrução Load Address carrega em $r1 o endereço de V[3]. Falaremos sobre o '''la''' depois.
lw $r2, 4($r1) # Carregamos para $r2 o quarto bit à partir de V[3]. Ou seja, o valor de y.
lw $r3, 12($r1) # Agora carregamos para $r3 o valor do inteiro w.
add $r4, $r2, $r3 # Somamos os valores de y e w colocando o valor em $r4.
sw $r4, 0($r1) # Colocamos o valor da soma no lugar do x.