Aula 05 - Instruções de Memória

Preview:

DESCRIPTION

Arquitetura de sistemas digitais

Citation preview

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES

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

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

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

ARQUITETURA MIPSTransferindo dados da 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.

ARQUITETURA MIPSTransferindo dados da Memória Formato

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

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]

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]

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.

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

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]

ARQUITETURA MIPSTransferindo dados para a 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.

ARQUITETURA MIPSTransferindo dados para a Memória Formato

fonte

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

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]

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

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]

ARQUITETURA MIPS

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

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]

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

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

Recommended