Sei sulla pagina 1di 24

ARQUITETURA E ORGANIZAO DE COMPUTADORES

INSTRUES DE ACESSO A MEMRIA

Igor Luiz Oliveira de Souza

ARQUITETURA MIPS
Linguagem de Montagem (Assembly) Instrues de acesso memria
Estruturas de dados podem ser bastante complexas, com um nmero de elementos
grande demais para serem armazenados nos registradores;
Estruturas de dados, como vetores, so armazenados na memria

Operaes lgicas e aritmticas s podem ser feitas quando os operandos esto


nos registradores:
MIPS deve fornecer instrues para transferir dados entre a memria e os registradores;
Para acessar uma palavra na memria, a instruo deve fornecer um endereo de memria

ARQUITETURA MIPS
Memria
Um grande vetor unidimensional, com endereo atuando como ndice
do vetor, comeando do 0.

ARQUITETURA MIPS
Transferindo dados da Memria

ARQUITETURA MIPS
Transferindo dados da Memria
A instruo de transferncia de dados da memria para o
registrador chamada de load.
Formato:

O endereo de memria acessado dado pela soma da constante


(chamada de offset) com o contedo do registrador base.

ARQUITETURA MIPS
Transferindo dados da Memria
Formato

ARQUITETURA MIPS
Transferindo dados da Memria
Suponhamos que temos um apontador a para um inteiro que est na memria, com o
endereo de memria dado no registrador $s3 (ou seja, o apontador est em $s3).
Suponha ainda que o compilador associou as variveis g e h aos registradores $s1 e
$s2. Qual o cdigo para o seguinte trecho em C:

Primeiro temos que pegar o operando que est na memria e transferi-lo para um
registrador:

lw

$t0, 0($s3)

add $s1,$s2,$t0

# temporrio $t0
#g

h + *a

*a

ARQUITETURA MIPS
Vetor na Memria

Vetor A = [0,0,0,0,15], com 5 posies, comeando no endereo de memria 102. Este


endereo chamado de endereo base do vetor. Assim:
102 o endereo de A[0];
103 o endereo de A[1]; .....;
106 o endereo de A[4]

ARQUITETURA MIPS
Vetor na Memria
Suponhamos que o vetor A tenha 100 posies, e que o compilador associou as
variveis g e h aos registradores $s1 e $s2. Temos ainda que o endereo base do
vetor A dado em $s3. Qual o cdigo para:

Primeiro temos que pegar o operando que est na memria e transferi-lo para um
registrador:

lw

$t0, 8($s3)

add $s1,$s2,$t0

# temporrio $t0
#g

h + A[8]

A[8]

ARQUITETURA MIPS
Acesso Memria
Uma vez que bytes (8 bits) so teis em muitos programas, arquiteturas permite
acessar bytes:
Portanto, o endereo de uma palavra o endereo de um dos 4 bytes dentro da
palavra;
Assim, os endereos de palavras consecutivas diferem em 4.

ARQUITETURA MIPS
Vetor na Memria
Cada posio do vetor (de inteiros) uma palavra, e portanto ocupa 4 bytes:

Vetor A = [0,0,0,0,15], com 5 posies, comeando no endereo de memria 408. Assim:


408 o endereo de A[0];
412 o endereo de A[1];
416 o endereo de A[2];
420 o endereo de A[3];
424 o endereo de A[4].

ARQUITETURA MIPS
Vetor na Memria
Suponhamos que o vetor A tenha 100 posies, e que o compilador associou as
variveis g e h aos registradores $s1 e $s2. Temos ainda que o endereo base do
vetor A dado em $s3. Qual o cdigo para:

A nona posio do vetor A, A[8], est no offset 8 x 4 = 32 :

lw

$t0, 32($s3)

add $s1,$s2,$t0

# temporrio $t0
#g

h + A[8]

A[8]

ARQUITETURA MIPS
Transferindo dados para a Memria

ARQUITETURA MIPS
Transferindo dados para a Memria
A instruo de transferncia de dados de um registrador para a
memria chamada de store.
Formato:

O endereo de memria acessado dado pela soma da constante


(chamada de offset) com o contedo do registrador base.

ARQUITETURA MIPS
Transferindo dados para a Memria
Formato

fonte

ARQUITETURA MIPS
Vetor na Memria
Suponhamos que o vetor A tenha 100 posies, e que o compilador associou a
variveis h ao registrador $s2. Temos ainda que o endereo base do vetor A dado
em $s3. Qual o cdigo para:

A nona posio do vetor A, A[8], est no offset 8 x 4 = 32:


lw $t0, 32($s3)

# temporrio $t0

A[8]

add $t1,$s2,$t0

# temporrio $t1

h + A[8]

A dcima terceira posio do vetor A, A[12], est no offset 12 x 4 = 48:


sw $t1, 48($s3)

# A[12]

$t1

ARQUITETURA MIPS
Vetor na Memria
Suponhamos que o endereo base da matriz B esteja armazenado em $s4. Qual o
cdigo assembly para trocar os valores do B[10] e do B[11]?
Primeiro os dados da memria localizados em B[10] e B[11] devem ser carregados em registradores
temporrios:
lw $t0, 40($s4)

# temporrio $t0

B[10]

lw $t1, 44($s4)

# temporrio $t1

B[11]

Depois os dados dos registradores devem ser guardados nos endereos de memria:
sw $t0, 44($s4)

# B[11]

B[10]

sw $t1, 40($s4)

# B[10]

B[11]

ARQUITETURA MIPS
Vetor na Memria
Suponhamos que o vetor A tenha 100 posies, e que o compilador associou as
variveis g, h e i aos registradores $s1, $s2 e $s4. Temos ainda que o endereo base
do vetor A dado em $s3. Qual o cdigo para:

Precisamos primeiro calcular o endereo de A[i]. Antes de somar i ao endereo base de


A, devemos multiplicar i por 4. Vamos fazer isto por enquanto da seguinte forma:

add $t1, $s4, $s4

# temporrio $t1

2xi

add $t1,$t1,$t1

# temporrio $t1

4xi

ARQUITETURA MIPS
Vetor na Memria
Para pegarmos A[i], somamos $t1 com o endereo base de A, dado em $s3:

add $t1, $t1, $s3

# temporrio $t1

(4i + $s3) endereo de A[i]

Agora podemos carregar A[i] para um registrador temporrio, e realizar a soma, que
ser armazenada em g:

lw $t0 0($t1)

# temporrio $t0

add $s1, $s2, $t0

#g

h + A[i]

valor de A[i]

ARQUITETURA MIPS

ARQUITETURA MIPS
Vetor na Memria
Suponhamos que o vetor A tenha 100 posies, e que o compilador associou as
variveis g e i aos registradores $s1 e $s2. Temos ainda que o endereo base do
vetor A dado em $s3 e do vetor C dado em $s4. Qual o cdigo para:

C[i] = g + A[i]
Precisamos primeiro calcular o endereo de A[i]. Antes de somar i ao endereo base de
A, devemos multiplicar i por 4. Vamos fazer isto por enquanto da seguinte forma:

add $t0, $s2, $s2

# temporrio $t0

2xi

add $t0,$t1,$t1

# temporrio $t0

4xi

ARQUITETURA MIPS
Vetor na Memria
Para pegarmos A[i], somamos $t1 com o endereo base de A, dado em $s3:

add $t1, $t0, $s3

# temporrio $t1

(4i + $s3) endereo de A[i]

Agora podemos carregar A[i] para um registrador temporrio, e realizar a soma, que
ser armazenada:

lw $t2 0($t1)

# temporrio $t2

valor de A[i]

add $t3, $s1, $t2

# temporrio $t3

g + A[i]

ARQUITETURA MIPS
Vetor na Memria
Para pegarmos C[i], somamos $t0 (4*i) com o endereo base de C, dado em $s4:

add $t4, $t0, $s4

# temporrio $t4

(4i + $s4) endereo de C[i]

Agora podemos guardar em C[i] o dado da adio realizada:

sw $t3, 0($t4)

# dado no endereo de C[i]

valor do temporrio $t3

ARQUITETURA MIPS
Suponha que os valores das variveis x, y e z estejam armazenados em $s2, $s3 e $s4 e
que o endereo base da matriz B esteja armazenada em $s6. Converta o cdigo em C
seguinte para o cdigo assembly usando o conjunto de instrues MIPS:
main() {
int x, y, z;
int B[20];

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

Potrebbero piacerti anche