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
| opcode | rs | rt | endereço |
| 6 bits | 5 bits | 5 bits | 16 bits |
| código de operação | registrador destino | registrador fonte | endereç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.
| opcode | rs | rt | rd | shamt | funct |
| 0 | 17 | 18 | 8 | 0 | 32 |
| 43 | 8 | 16 | 15 |
Código de Máquina
O código de máquina para a[15] = b + c ficará da seguinte forma:
| opcode | rs | rt | rd | shamt | funct |
| 000 000 | 10001 | 10010 | 01000 | 00000 | 100 000 |
| 101 011 | 01000 | 10000 | 0000 0000 0000 1111 |
00000010001100100100000000100000
10101101000100000000000000001111
Resumo
Formato Tipo R
| opcode | rs | rt | rd | shamt | funct |
| 6 bits | 5 bits | 5 bits | 5 bits | 5 bits | 6 bits |
| código da operação | registrador fonte | registrador fonte | registrador destino | deslocamento | sub código da operação |
Formato Tipo I
| opcode | rs | rt | endereço |
| 6 bits | 5 bits | 5 bits | 16 bits |
| código da operação | registrador destino | registrador fonte | endereço de memória |
Instruções
Tipo R:
| Instrução | Exemplo | |
| ADD registrador destino, registrador fonte, registrador fonte | ADD $t0, $s0, $s1 | $t0 = $s0 + $s1 |
| SUB registrador destino, registrador fonte, registrador fonte | SUB $t1, $s3, $s4 | $t1 = $s3 – $s4 |
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 |
Exercícios
Converta as instruções abaixo:
- a[10] = b – c;
- b[245] = a + c;
- c[0] = b – a;
Use $s0 para a, $s1 para b e $s2 para c.





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 )
Oi Rogério. Muito Obrigada pelo toque, vou conferir. Ainda bem que tenho leitores atentos! [ ]s
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
É 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?!
Tudo bem. Já fiz.
olha!!!!