Buscar

03-Arq 1 Instruções de Memória

Prévia do material em texto

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, y e z 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: 
 main() { 
 int x, y, z; 
 int B[20]; 
 
 B[0] = x; 
 y = B[2] + B[3]; 
 } 
 
sw $s2, 0($s6) // B[0] = xlw $t0, 8($s6) // t0 = B[2] 
lw $t1, 12($s6) // t1 = B[3] 
add $s3,$t0,$t1 // y = t0+t1 
	Slide 1
	Slide 2
	Slide 3
	Slide 4
	Slide 5
	Slide 6
	Slide 7
	Slide 8
	Slide 9
	Slide 10
	Slide 11
	Slide 12
	Slide 13
	Slide 14
	Slide 15
	Slide 16
	Slide 17
	Slide 18
	Slide 19
	Slide 20
	Slide 21
	Slide 22
	Slide 23
	Slide 24

Outros materiais

Materiais relacionados

Perguntas relacionadas

Perguntas Recentes