Armazenando um valor em Array no MIPS

instrução MIPS LW e SW IF Simples no MIPS

Oi pessoal! No artigo passado aprendemos a usar a instrução MIPS LW (Load Word), para carregar um operando da memória para um registrador. Hoje aprenderemos a usar a instrução SW - Store Word - para fazer o processo inverso, armazenando um valor em Array no MIPS.

 

 

STORE WORD - SW

 

A instrução Store Word tem como objetivo armazenar um valor, que está em um registrador, na memória. Store Word significa Armazenar Palavra, ao pé da letra, assim como Load Word significa Carregar Palavra.

 

Essas duas instruções, LW e SW, são idênticas em seu formato, o que muda de fato é o objetivo de cada uma, de forma que devemos tomar cuidado ao passá-las para a Representação, pois os campos têm de receber os valores corretos, cuidado para não se confundir. Veja a Tabela 1:

 

Tabela 1: Representação de Instruções do Formato Tipo I

opcodersrtendereço
6 bits5 bits5 bits16 bits
código de operaçãoregistrador destinoregistrador fonteendereço de memória

 

É exatamente igual à instrução LW, mas a SW inverte RS (fonte) e RT (destino)! Agora vamos ver a sintaxe da instrução:

 

SW registrador_fonte, valor (registrador_destino)

 

Exemplo:

 

SW $t0, 30 ( $s0 )     # memória [ $s0 + 30 ] = $t0

 

Exatamente a mesma forma, MAS, observe que agora a memória é quem está recebendo o valor do registrador; o registrador destino está depois e o registrador fonte está antes, isto é, estão invertidos em relação à instrução LW. Portanto, $t0 é o valor que deve ser armazenado no endereço de memória determinado por ($s0 + 30).

 

 

Compilação de instruções SW

 

Agora que já fomos apresentados à instrução SW, vamos ver como fica a conversão da seguinte instrução:

 

a[15] = b + c

 

Vamos usar $s0 para a, $s1 para b e $s2 para c. O primeiro passo é converter b + c, que ficará assim:

 

ADD $t0, $s1, $s2         # $t0 = $s1 + $s2

 

A instrução acima realiza a soma de b com c, armazenando o resultado em $t0. Agora, vamos armazenar $t0 no endereço de memória, que é o nosso array a[15]:

 

SW $t0, 15 ( $s0)      # memória [ 15 + $s0 ] =  $t0

 

a[15] é correspondente ao código 15 ( $s0 ) e $t0 é o valor da soma. Portanto, o código final é:

 

ADD $t0, $s1, $2

SW $t0, 15 ( $s0 )

 

 

Linguagem de Máquina

 

A Linguagem de Máquina para a[15] = b + c ficará da seguinte forma: (lembre-se de consultar as tabelas que foram apresentadas no artigo PRIMEIRA INSTRUÇÃO MIPS)

 

ADD $8, $17, $18

SW $8, 15 ( $16 )

 

  

Representação da Linguagem de Máquina

 

A representação da linguagem de máquina para a[15] = b + c ficará da seguinte forma. RS e RT são os registradores fonte e RD o registrador destino, para as instruções do tipo R. Para as instruções STORE WORD, RS é o registrador fonte e RT é o registrador destino. Finalizando, para as instruções LOAD WORD, RS é o registrador destino e RT é o registrador fonte. Não se esqueça de consultar as tabelas para fazer a Representação.

 

opcodersrtrdshamtfunct
017188032
4381615

 

 

Código de Máquina

 

O código de máquina para a[15] = b + c ficará da seguinte forma:

 

opcodersrtrdshamtfunct
000 00010001100100100000000100 000
101 01101000100000000 0000 0000 1111

 

00000010001100100100000000100000

10101101000100000000000000001111

 

 

Resumo

 

Formato Tipo R 

 

opcodersrtrdshamtfunct
6 bits5 bits5 bits5 bits5 bits6 bits
código da operaçãoregistrador fonteregistrador fonteregistrador destinodeslocamentosub código da operação

 

 

Formato Tipo I 

 

opcodersrtendereço
6 bits5 bits5 bits16 bits
código da operaçãoregistrador destinoregistrador fonteendereço de memória

 

 

Instruções

 

Tipo R:

InstruçãoExemplo 
ADD registrador destino, registrador fonte, registrador fonteADD $t0, $s0, $s1$t0 = $s0 + $s1
SUB registrador destino, registrador fonte, registrador fonteSUB $t1, $s3, $s4$t1 = $s3 - $s4

 

 

Tipo I:

InstruçãoExemplo 
LW registrador destino, valor ( registrador fonte)LW $t0, 20 ( $s0 )$t0 = memória [ 20 + $s0 ]
SW registrador destino, valor ( registrador fonte)SW $t0, 20 ( $s0 )memória [ 20 + $s0 ] = $t0

 

 

Exercícios

 

Converta as instruções abaixo:

 

  1. a[10] = b - c;
  2. b[245] = a + c;
  3. c[0] = b - a;

 

Use $s0 para a, $s1 para b e $s2 para c.

Outros artigos da série

<< Convertendo uma instrução com Array no MIPSInstruções LW e SW com Array no MIPS >>
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Elaine Cecília Gatto
Bacharel em Engenharia de Computação. Mestre em Ciência da Computação. Doutoranda em Ciência da Computação. Co-fundarora e Líder das #GarotasCPBr. Pesquisadora Convidada no Grupo de Pesquisa: "Artes em Tecnologias Emergentes" do Programa de Pós Graduação em Design na UNESP Campus Bauru. Cantora, Docente no Magistério Superior, Geek, Nerd, Otaku e Gamer. Apaixonada por Michael Jackson, Macross, Rocky Balboa, Séries, Filmes, Cervejas e Vinhos. Mais informações sobre mim você encontra em: http://lattes.cnpq.br/8559022477811603.

6
Deixe um comentário

avatar
 
2 Comment threads
4 Thread replies
2 Followers
 
Most reacted comment
Hottest comment thread
4 Comment authors
Elaine Cecília GattoRogérioElaine Cecília GattoSouza Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Rogério
Visitante
Rogério

Olá muito bom seu material.
Só confira o cálculo do deslocamento para acessar um arranjo pelos seus sobrescritos nas instruções de lw e sw. Acredito que deva considerar o tamanho do tipo de dado utilizado, se for inteiro de 32 bits, os elementos estarão de 4 em 4 bytes. O a[0]= 0*4 =0, o a[1] do 4 byte para frente e o endereço do byte inicial do elemento 15, o a[15] será 15 * 4 = 60. Considerando $s0 como o endereço de base para 'a' ou o a[0]:
SW $t0, 60( $s0 )

Souza
Visitante
Souza

Só um duvida.
SW seria: registrador fonte, valor (registrador destino).
Os dois abaixo ficaram iguais.

Apesar que no final:
LW - $t0 = memória [ 20 + $s0 ]
SW - memória [ 20 + $s0 ] = $t0
Ficaram corretas.

Tipo I:
Instrução Exemplo
LW registrador destino, valor ( registrador fonte) LW $t0, 20 ( $s0 ) $t0 = memória [ 20 + $s0 ]
SW registrador destino, valor ( registrador fonte) SW $t0, 20 ( $s0 ) memória [ 20 + $s0 ] = $t0

Elaine Cecília Gatto
Visitante
Elaine Cecília Gatto

É meio confuso mesmo Souza, mas no livro do Patterson está exatamente assim. Eu preferi manter como o criador do MIPS fez!!!! Mas você pode fazer uma anotação pessoal sua para não se perder, tudo bem?!

Souza
Visitante
Souza

Tudo bem. Já fiz.

Elaine Cecília Gatto
Visitante
Elaine Cecília Gatto

olha!!!!