Logo Passei Direto
Buscar
Material

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES 
INSTRUÇÕES DE ACESSO A MEMÓRIA 
Críjina Chagas 
ARQUITETURA MIPS 
Linguagem de Montagem (Assembly) – Instruções de acesso à memória 
 Estruturas de dados podem ser bastante complexas, com um número de elementos 
grande demais para serem armazenados nos registradores; 
 Estruturas de dados, como vetores, são armazenados na memória 
Operações lógicas e aritméticas só podem ser feitas quando os operandos estão 
nos registradores: 
 MIPS deve fornecer instruções para transferir dados entre a memória e os registradores; 
 Para acessar uma palavra na memória, a instrução deve fornecer um endereço de memória 
ARQUITETURA MIPS 
 Memória 
 Um grande vetor unidimensional, com endereço atuando como índice 
do vetor, começando do 0. 
 
 
ARQUITETURA MIPS 
 Transferindo dados da Memória 
 
 
 
 
 
 
 
ARQUITETURA MIPS 
 Transferindo dados da Memória 
 A instrução de transferência de dados da memória para o 
registrador é chamada de load. 
 
 Formato: 
 
 
A Endereço de memória acessado e dado pela soma da constante 
(chamada de offset) com o conteúdo do registrador base. 
 
ARQUITETURA MIPS 
 Transferindo dados da Memória 
 Formato 
 
 
 
 
 
ARQUITETURA MIPS 
 Transferindo dados da Memória 
 Suponhamos que temos um apontador a para um inteiro que está na memória, com o 
endereço de memória dado no registrador $s3 (ou seja, o apontador está em $s3). 
Suponha ainda que o compilador associou as variáveis g e h aos registradores $s1 e 
$s2. Qual o código para o seguinte trecho em C: 
 
 Primeiro temos que pegar o operando que está na memória e transferi-lo para um 
registrador: 
lw $t0, 0($s3) # temporário $t0 *a 
add $s1,$s2,$t0 # g h + *a 
 
ARQUITETURA MIPS 
 Vetor na Memória 
 
 
 
 
 
Vetor A = [0,0,0,0,15], com 5 posições, começando no endereço de memória 102. Este 
endereço é chamado de endereço base do vetor. Assim: 
 102 é o endereço de A[0]; 
 103 é o endereço de A[1]; .....; 
 106 é o endereço de A[4] 
 
ARQUITETURA MIPS 
 Vetor na Memória 
 Suponhamos que o vetor A tenha 100 posições, e que o compilador associou as 
variáveis g e h aos registradores $s1 e $s2. Temos ainda que o endereço base do 
vetor A é dado em $s3. Qual o código para: 
 
 Primeiro temos que pegar o operando que está na memória e transferi-lo para um 
registrador: 
lw $t0, 8($s3) # temporário $t0 A[8] 
add $s1,$s2,$t0 # g h + A[8] 
 
 
ARQUITETURA MIPS 
 Acesso à Memória 
Uma vez que bytes (8 bits) são úteis em muitos programas, arquiteturas permite 
acessar bytes: 
 Portanto, o endereço de uma palavra é o endereço de um dos 4 bytes dentro da 
palavra; 
 Assim, os endereços de palavras consecutivas diferem em 4. 
 
 
ARQUITETURA MIPS 
 Vetor na Memória 
 Cada posição do vetor (de inteiros) é uma palavra, e portanto ocupa 4 bytes: 
 
 
 
 
 
 
 Vetor A = [0,0,0,0,15], com 5 posições, começando no endereço de memória 408. Assim: 
 408 é o endereço de A[0]; 
 412 é o endereço de A[1]; 
 416 é o endereço de A[2]; 
 420 é o endereço de A[3]; 
 424 é o endereço de A[4]. 
 
 
ARQUITETURA MIPS 
 Vetor na Memória 
 Suponhamos que o vetor A tenha 100 posições, e que o compilador associou as 
variáveis g e h aos registradores $s1 e $s2. Temos ainda que o endereço base do 
vetor A é dado em $s3. Qual o código para: 
 
 
A nona posição do vetor A, A[8], está no offset 8 x 4 = 32 : 
lw $t0, 32($s3) # temporário $t0 A[8] 
add $s1,$s2,$t0 # g h + A[8] 
 
 
ARQUITETURA MIPS 
 Transferindo dados da Memória 
 
 
 
 
 
 
 
ARQUITETURA MIPS 
 Transferindo dados da Memória 
 A instrução de transferência de dados de um registrador para a 
memória é chamada de store. 
 
 Formato: 
 
 
A Endereço de memória acessado e dado pela soma da constante 
(chamada de offset) com o conteúdo do registrador base. 
 
ARQUITETURA MIPS 
 Transferindo dados para a Memória 
 Formato 
 
 
 
 
 
fonte 
ARQUITETURA MIPS 
 Vetor na Memória 
 Suponhamos que o vetor A tenha 100 posições, e que o compilador associou a 
variáveis h ao registrador $s2. Temos ainda que o endereço base do vetor A é dado 
em $s3. Qual o código para: 
 
 A nona posição do vetor A, A[8], está no offset 8 x 4 = 32: 
 lw $t0, 32($s3) # temporário $t0 A[8] 
add $t1,$s2,$t0 # temporário $t1 h + A[8] 
 A décima terceira posição do vetor A, A[12], está no offset 12 x 4 = 48: 
 sw $t1, 48($s3) # A[12] $t1 
 
ARQUITETURA MIPS 
 Vetor na Memória 
 Suponhamos que o endereço base da matriz B esteja armazenado em $s4. Qual o 
código assembly para trocar os valores do B[10] e do B[11]? 
 Primeiro os dados da memória localizados em B[10] e B[11] devem ser carregados em registradores 
temporários: 
 lw $t0, 40($s4) # temporário $t0 B[10] 
 lw $t1, 44($s4) # temporário $t1 B[11] 
Depois os dados dos registradores devem ser guardados nos endereços de memória: 
 sw $t0, 44($s4) # B[11] B[10] 
 sw $t1, 40($s4) # B[10] B[11] 
 
 
ARQUITETURA MIPS 
 Vetor na Memória 
 Suponhamos que o vetor A tenha 100 posições, e que o compilador associou as 
variáveis g, h e i aos registradores $s1, $s2 e $s4. Temos ainda que o endereço base 
do vetor A é dado em $s3. Qual o código para: 
 
 
 Precisamos primeiro calcular o endereço de A[i]. Antes de somar i ao endereço base de 
A, devemos multiplicar i por 4. Vamos fazer isto por enquanto da seguinte forma: 
 add $t1, $s4, $s4 # temporário $t1 2 x i 
 add $t1,$t1,$t1 # temporário $t1 4 x i 
 
ARQUITETURA MIPS 
 Vetor na Memória 
 Para pegarmos A[i], somamos $t1 com o endereço base de A, dado em $s3: 
 add $t1, $t1, $s3 # temporário $t1 (4i + $s3) endereço de A[i] 
 
Agora podemos carregar A[i] para um registrador temporário, e realizar a soma, que 
será armazenada em g: 
 lw $t0 0($t1) # temporário $t0 valor de A[i] 
 add $s1, $s2, $t0 # g h + A[i] 
 
 
ARQUITETURA MIPS 
 
 
 
ARQUITETURA MIPS 
 Vetor na Memória 
 Suponhamos que o vetor A tenha 100 posições, e que o compilador associou as 
variáveis g e i aos registradores $s1 e $s2. Temos ainda que o endereço base do 
vetor A é dado em $s3 e do vetor C é dado em $s4. Qual o código para: 
 
 C[i] = g + A[i] 
 
 Precisamos primeiro calcular o endereço de A[i]. Antes de somar i ao endereço base de 
A, devemos multiplicar i por 4. Vamos fazer isto por enquanto da seguinte forma: 
 add $t0, $s2, $s2 # temporário $t0 2 x i 
 add $t0,$t1,$t1 # temporário $t0 4 x i 
 
ARQUITETURA MIPS 
 Vetor na Memória 
 Para pegarmos A[i], somamos $t1 com o endereço base de A, dado em $s3: 
 add $t1, $t0, $s3 # temporário $t1 (4i + $s3) endereço de A[i] 
 
Agora podemos carregar A[i] para um registrador temporário, e realizar a soma, que 
será armazenada: 
 lw $t2 0($t1) # temporário $t2 valor de A[i] 
 add $t3, $s1, $t2 # temporário $t3 g + A[i] 
 
 
ARQUITETURA MIPS 
 Vetor na Memória 
 Para pegarmos C[i], somamos $t0 (4*i) com o endereço base de C, dado em $s4: 
 add $t4, $t0, $s4 # temporário $t4 (4i + $s4) endereço de C[i] 
 
Agora podemos guardar em C[i] o dado da adição realizada: 
 sw $t3, 0($t4) # dado no endereço de C[i] valor do temporário $t3 
 
 
 
ARQUITETURA MIPS 
 Suponha que os valores das variáveis x e y estejam armazenados
em $s2, $s3 e $s4 e 
que o endereço base da matriz B esteja armazenada em $s6. Converta o código em C 
seguinte para o código assembly usando o conjunto de instruções MIPS: 
 
 B[0] = x; 
 y = B[2] + B[3]; 
 
 
 
sw $s2, 0($s6) // B[0] = x 
lw $t0, 8($s6) // t0 = B[2] 
lw $t1, 12($s6) // t1 = B[3] 
add $s3,$t0,$t1 // y = t0+t1

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?