Testando as instruções MIPS no MARS

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

Oi galera! No artigo de hoje vou ensinar vocês a testarem os códigos que fizemos até agora em um simulador bem simples chamado MARS. Não aprofundarei alguns detalhes do simulador e da compilação pois farei isto com bastante calma em outros artigos, porém, agora já estão preparados para usar mais do que papel e lápis e testar o que já foi feito. Vamos lá então.

 

Instalando o MARS

 

O MARS é um simulador realmente muito simples, você pode baixa-lo aqui. Neste site você também encontra outras informações relevantes sobre o simulador, fique à vontade para ler a respeito. Após realizar o download, tudo o que você precisará fazer é clicar duas vezes na aplicação, que na verdade é um JAR, ou seja, uma aplicação Java Desktop. Ao fazer isso, você verá uma tela parecida com a apresentada na Figura 1:

 

Tela Inicial do MARS
Figura 1: Tela Inicial do MARS

 

Agora faça o seguinte, vá em FILE e escolha NEW, a sua tela vai ficar conforme a Figura 2:

 

Criando um novo arquivo ASM no MARS
Figura 2: Criando um novo arquivo ASM no MARS

 

Legal, agora vamos testar o nosso primeiro exemplo, lá do primeiro artigo.

 

Exemplo 1

 

Vamos supor que $s2 seja 10 e $s3 seja 15, para podermos testar aqui a operação.

 

ADD      $s1, $s2, $3

 

Para testar esse código você vai digitar o seguinte na aba mips1.asm

 

.text
li $s2, 10           #carrega o valor IMEDIATO 10 no registrador s2 (li = load immediate)
li $s3, 15           #carrega o valor IMEDIATO 15 no registrador s3
add $s1, $s2, $s3    #executa a soma de s2 com s3 e armazena o resultado em s1

 

Após digitar isto, salve o arquivo. Vá em FILE, escolha SAVE, escolha a pastinha onde você deseja salvar seus arquivos “.asm”, que são os arquivos Assembly, e dê um nome para o seu arquivo. No meu caso, eu escolhi a própria pasta do MARS, criei uma pasta ali chamada EXEMPLOS, e estou dando os nomes de exemplo1.asm, exemplo2.asm e assim por diante. “.text” é uma diretiva do montador, indicando que as linhas a seguir contêm instruções. Para executar, vá até o menu RUN e escolha ASSEMBLE. Quando fizer isto, a tela mudará, conforme a Figura 3:

 

Executando o código assembly MIPS no MARS
Figura 3: Executando o código assembly MIPS no MARS

 

Observe as seguintes seções nesta tela:

 

Execute: Apresenta uma tabela com todas as linhas do seu código com o respectivo endereço de memória, e código de máquina, em hexadecimal, assim como o código Basic e o Source, que é o código fonte. Note que em Basic, o código fonte que digitamos em MIPS fica da seguinte forma:

 

addiu $18, $0, 0x00000000a            #$18 = 0 + 10
addiu $19, $0, 0x00000000f            #$19 = 0 + 15
add $17, $18, $19                     #$17 = $18 + $19 = 10 + 15 = 25

 

Conforme a referência MIPS, ADDIU é uma instrução de adição imediata sem overflow, que coloca a soma do registrador RS e o imediato com sinal estendido no registrador RT. Basicamente, aqui os valores imediatos que determinamos, 10 e 15, foram convertidos para o sistema de numeração hexadecimal, A e F, respectivamente, e então somados com ZERO ($0). Caso você ainda não saiba como fazer a conversão entre sistemas de numeração, aconselho a dar uma breve estudada, apenas para não ficar muito perdido nessa sopa de letrinhas e números. O número 25 convertido em hexadecimal é 19, em binário é 00011001 e em octal é 31.

 

Observe que na coluna ADDRESS os endereços estão sempre como múltiplos de 4: 0x00400000, 0x00400004 e 0x00400008. Note também que a primeira linha do código está destacada em amarelo.

 

Data Segment: Essa é a área de segmento de dados (DS), ou mais famosamente conhecida como Memória! Vamos aprender mais sobre essa Aba em outros exemplos. Você pode escolher a forma que quer ver os endereços de memória selecionando-os nos checks boxes logo abaixo: endereços hexadecimais, valores hexadecimais e ainda ASCII. Também pode escolher a região de memória a partir das setinhas para a direita e esquerda e do combobox.

 

Mars Messages: Apresenta mensagens produzidas pelo menu RUN.

 

Run I/O: É um console de entrada e saída do simulador.

 

Registers: Referente aos registradores do MIPS.

 

Coproc1: Referente aos registradores da unidade de ponto flutuante.

 

Coproc0: Referente aos registradores de interrupções e exceções.

 

Para ver a execução, você utilizará o botão de execução passo a passo, conforme apresenta a Figura 4:

 

Botão de execução passo a passo (linha a linha)
Figura 4: Botão de execução passo a passo (linha a linha)

 

Clique apenas uma vez neste botão. Note que ela marca o registrador $s2 de verde, mostrando o valor dele, 0x00000000a, e marca a segunda linha como ativa. Verifique na Figura 5:

 

Valores e estados dos registradores.
Figura 5: Valores e estados dos registradores.

 

Clique mais uma vez neste botão. Agora a terceira linha está ativa e o registrador $s3 ficou verde, com o valor 0x00000000f. Verifique na Figura 6:

 

Valores e estado dos registradores
Figura 6: Valores e estado dos registradores

 

Clique mais uma vez neste botão. A execução do código é finalizada e o registrador $s1 é marcado de verde, com o valor 0x000000019. Verifique na Figura 7:

 

Finalizando a execução passo a passo.
Figura 7: Finalizando a execução passo a passo.

 

Dessa forma, vimos como executar nossos programas de forma bem simples no MARS, e verificar seus valores.

 

Exemplo 2

 

Vamos ver mais um exemplo, do segundo artigo:

 

a = b + c;

ADD $t0, $s0, $s1

ADD $8, $16, $17

 

No MARS crie um novo arquivo e digite o seguinte código:

 

.text
li $s0, 20              #carrega o valor IMEDIATO 20 no registrador s0
li $s1, 47              #carrega o valor IMEDIATO 47 no registrador s1
add $t0, $s0, $s1       #executa a soma de s2 com s3 e armazena o resultado em t0

 

Salve-o e execute-o passo a passo. Vamos ver como ficam os números convertidos na base binária:

 

20

0

0

0

1

0

1

0

0

27

26

25

24

23

22

21

20

128

64

32

16

8

4

2

1

16 + 4 = 20

 

47

0

0

1

0

1

1

1

1

27

26

25

24

23

22

21

20

128

64

32

16

8

4

2

1

32 + 8 + 4 + 2 + 1 = 47

 

 

Portanto (20)10 = (00010100)2 e (47)10 = (00101111)2. Convertendo agora para hexadecimal:

 

20

0

0

0

1

0

1

0

0

23

22

21

20

23

22

21

20

8

4

2

1

8

4

2

1

1

4

 

47

0

0

1

0

1

1

1

1

23

22

21

20

23

22

21

20

8

4

2

1

8

4

2

1

2

8 + 4 + 2 + 1 = 15 = F

 

 

Onde A = 10, B = 11, C = 12, D = 13, E = 14 e F = 15. Portanto (20)10 = (14)16 e (47)10 = (2F)16. Somando 20 com 47 temos 67 que é (67)10 = (01000011)2 = (43)16.

 

67

0

1

0

0

0

0

1

1

27

26

25

24

23

22

21

20

128

64

32

16

8

4

2

1

64 + 2 + 1 = 67

 

67

0

1

0

0

0

0

1

1

23

22

21

20

23

22

21

20

8

4

2

1

8

4

2

1

4

2 + 1 = 3

 

 

Verifique os valores nos registradores. Você vai perceber que estão corretos! É importante ter essa base de conversão entre sistemas de numeração decimal, binário e hexadecimal bem claro em sua mente. Algumas pessoas estão tão acostumadas que conseguem fazer de cabeça até determinado limite, mas é claro que números enormes são complicados de converter mentalmente. Você pode tirar a prova usando a calculadora de programador disponível na calculadora do Windows.

 

Exemplo 3

 

Vamos testar mais um código, o do terceiro artigo:

 

a = b - ( c  -  d ) + e

 

SUB $t1, $s2, $s3 # $t1 = ( $s2 - $s3 ) é o mesmo que $t1 = ( c - d )
SUB $t1, $s1, $t1 # $t1 = $s1 - $t1 é o mesmo que $t1 = b - ( c - d )
ADD $s0, $t1, $s4 # $s0 = $t1 + $s4 é o mesmo que $s0 = b - ( c - d ) + e

 

SUB $9, $18, $19   # $t1 = ( $s2 - $s3 ) é o mesmo que $t1 = ( c - d )
SUB $9, $17, $9    # $t1 = $s1 - $t1 é o mesmo que $t1 = b - ( c - d )
ADD $16, $9, $20   # $s0 = $t1 + $s4 é o mesmo que $s0 = b - ( c - d ) + e

 

Considere que $s2 = 33 e $s3 = 77. No MARS crie um novo arquivo e digite o seguinte código:

 

.text
li $s2, 33
li $s3, 77
SUB $t1, $s2, $s3 # $t1 = ( $s2 - $s3 ) é o mesmo que $t1 = ( c - d )
SUB $t1, $s1, $t1 # $t1 = $s1 - $t1 é o mesmo que $t1 = b - ( c - d )
ADD $s0, $t1, $s4 # $s0 = $t1 + $s4 é o mesmo que $s0 = b - ( c - d ) + e

 

Salve, execute e verifique os valores. Você deve estar se perguntando porque tem um monte de F no resultado da subtração. Explicando de forma bem superficial, isso acontece pois o resultado dá negativo, visto que 33-77 = -44, e o F neste caso está representando o sinal negativo. Falarei sobre números com e sem sinal em um artigo específico. Bom, acho que agora já ficou bem claro como funciona né! Que tal testar os exercícios que você fez? Aqueles que eu deixei como tarefinha?!

 

Conclusão

 

Neste artigo comecei a mostrar a você como testar os códigos do Assembly MIPS no simulador MARS. No próximo artigo, darei continuidade aos testes dos exemplos que passei nos artigos anteriores. Não se esqueçam de deixar as dúvidas aqui nos comentários. Muito obrigada e até a próxima.

 

Saiba mais

 

SiFive lança o primeiro SoC RISC-V compatível com Linux

FE310G: Um microcontrolador open source - Interrupções no RISC-V

FE310G: Um microcontrolador open source - Estrutura básica do RISC-V

Outros artigos da série

<< Compilando Arrays com índice variável no MIPSExecutando um Array no MARS para 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.

Deixe um comentário

avatar
 
  Notificações  
Notificar