Aula 05 - Instruções de Memória

24
ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES INSTRUÇÕES DE ACESSO A MEMÓRIA Igor Luiz Oliveira de Souza

description

Arquitetura de sistemas digitais

Transcript of Aula 05 - Instruções de Memória

Page 1: Aula 05 - Instruções de Memória

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES

INSTRUÇÕES DE ACESSO A MEMÓRIAIgor Luiz Oliveira de Souza

Page 2: Aula 05 - Instruções de Memória

ARQUITETURA MIPSLinguagem 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

Page 3: Aula 05 - Instruções de Memória

ARQUITETURA MIPSMemória Um grande vetor unidimensional, com endereço atuando como índice do vetor, começando do 0.

Page 4: Aula 05 - Instruções de Memória

ARQUITETURA MIPSTransferindo dados da Memória

Page 5: Aula 05 - Instruções de Memória

ARQUITETURA MIPSTransferindo dados da Memória A instrução de transferência de dados da memória para oregistrador é chamada de load.

Formato:

O endereço de memória acessado é dado pela soma da constante (chamada de offset) com o conteúdo do registrador base.

Page 6: Aula 05 - Instruções de Memória

ARQUITETURA MIPSTransferindo dados da Memória Formato

Page 7: Aula 05 - Instruções de Memória

ARQUITETURA MIPSTransferindo dados da Memória Suponhamos que temos um apontador a para um inteiro que está na memória, com oendereç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 umregistrador:

lw $t0, 0($s3) # temporário $t0 *a

add $s1,$s2,$t0 # g h + *a

Page 8: Aula 05 - Instruções de Memória

ARQUITETURA MIPSVetor na Memória

Vetor A = [0,0,0,0,15], com 5 posições, começando no endereço de memória 102. Esteendereç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]

Page 9: Aula 05 - Instruções de Memória

ARQUITETURA MIPSVetor na Memória Suponhamos que o vetor A tenha 100 posições, e que o compilador associou asvariáveis g e h aos registradores $s1 e $s2. Temos ainda que o endereço base dovetor A é dado em $s3. Qual o código para:

Primeiro temos que pegar o operando que está na memória e transferi-lo para umregistrador:

lw $t0, 8($s3) # temporário $t0 A[8]

add $s1,$s2,$t0 # g h + A[8]

Page 10: Aula 05 - Instruções de Memória

ARQUITETURA MIPSAcesso à MemóriaUma vez que bytes (8 bits) são úteis em muitos programas, arquiteturas permiteacessar bytes:

Portanto, o endereço de uma palavra é o endereço de um dos 4 bytes dentro dapalavra;

Assim, os endereços de palavras consecutivas diferem em 4.

Page 11: Aula 05 - Instruções de Memória

ARQUITETURA MIPSVetor 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].

Page 12: Aula 05 - Instruções de Memória

ARQUITETURA MIPSVetor na Memória Suponhamos que o vetor A tenha 100 posições, e que o compilador associou asvariáveis g e h aos registradores $s1 e $s2. Temos ainda que o endereço base dovetor 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]

Page 13: Aula 05 - Instruções de Memória

ARQUITETURA MIPSTransferindo dados para a Memória

Page 14: Aula 05 - Instruções de Memória

ARQUITETURA MIPSTransferindo dados para a Memória A instrução de transferência de dados de um registrador para amemória é chamada de store.

Formato:

O endereço de memória acessado é dado pela soma da constante (chamada de offset) com o conteúdo do registrador base.

Page 15: Aula 05 - Instruções de Memória

ARQUITETURA MIPSTransferindo dados para a Memória Formato

fonte

Page 16: Aula 05 - Instruções de Memória

ARQUITETURA MIPSVetor na Memória Suponhamos que o vetor A tenha 100 posições, e que o compilador associou avariáveis h ao registrador $s2. Temos ainda que o endereço base do vetor A é dadoem $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

Page 17: Aula 05 - Instruções de Memória

ARQUITETURA MIPSVetor na Memória Suponhamos que o endereço base da matriz B esteja armazenado em $s4. Qual ocó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 registradorestemporá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]

Page 18: Aula 05 - Instruções de Memória

ARQUITETURA MIPSVetor na Memória Suponhamos que o vetor A tenha 100 posições, e que o compilador associou asvariáveis g, h e i aos registradores $s1, $s2 e $s4. Temos ainda que o endereço basedo 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 deA, 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

Page 19: Aula 05 - Instruções de Memória

ARQUITETURA MIPSVetor 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, queserá armazenada em g:

lw $t0 0($t1) # temporário $t0 valor de A[i]

add $s1, $s2, $t0 # g h + A[i]

Page 20: Aula 05 - Instruções de Memória

ARQUITETURA MIPS

Page 21: Aula 05 - Instruções de Memória

ARQUITETURA MIPSVetor na Memória Suponhamos que o vetor A tenha 100 posições, e que o compilador associou asvariáveis g e i aos registradores $s1 e $s2. Temos ainda que o endereço base dovetor 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 deA, 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

Page 22: Aula 05 - Instruções de Memória

ARQUITETURA MIPSVetor 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, queserá armazenada:

lw $t2 0($t1) # temporário $t2 valor de A[i]

add $t3, $s1, $t2 # temporário $t3 g + A[i]

Page 23: Aula 05 - Instruções de Memória

ARQUITETURA MIPSVetor 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

Page 24: Aula 05 - Instruções de Memória

ARQUITETURA MIPSSuponha que os valores das variáveis x, y e z estejam armazenados em $s2, $s3 e $s4 eque o endereço base da matriz B esteja armazenada em $s6. Converta o código em Cseguinte 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