Baixe o app para aproveitar ainda mais
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
Compartilhar