Ponto Flutuante no MIPS

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

Oi pessoal! No último artigo da série MIPS eu mostrei como compilar o comando FOR e, portanto, dessa forma, todos os comandos de controle foram tratados nesta série. Em outros artigos, também expliquei as instruções aritméticas, lógicas e relacionais, assim como também os procedimentos. De maneira geral, vimos praticamente tudo a respeito de MIPS. Como existem muitas instruções, eu tratei das mais importantes aqui nesta série, mas se você consultar a documentação oficial do MIPS, você encontrará muitas outras, que normalmente são variações das principais. Falta falar sobre Ponto Flutuante, que será o tema deste artigo. Vamos nessa então?

Ponto Flutuante

O coprocessador 1 do MIPS é usado para Ponto Flutuante (P.F.). Ele lida com precisão simples, o que é equivalente a 32 bits, e precisão dupla, 64 bits. Se observarmos no MARS, veremos uma parte dedicada somente a este coprocessador, conforme mostra a Figura abaixo.

Mars Ponto Flutuante
Mars Ponto Flutuante

Os registradores são numerados de $f0 até $f31. Note também que somente os registradores pares possuem suporte à precisão dupla. Além disto, existem oito flags de código de condição (cc) que são testados, ou alterados, por instruções de movimentação condicionais, desvio e comparação. As instruções lwc1, swc1, mtc1 e mtc1 fazem a movimentação dos valores de precisão simples nesses registradores, enquanto as instruções l.s, l.d, s.s e s.d, fazem a movimentação de precisão dupla. A tabela a seguir resume as instruções de movimentação rapidamente:

Instrução

opcode

rs

rt

rd

shamt

funct

 

6 bits

5 bits

5 bits

5 bits

5 bits

6 bits

mfhi rd

0

0

rd

0

0x10

mflo rd

0

0

rd

0

0x12

mthi rs

0

rs

0

0x11

mtlo rs

0

rs

0

0x13

mfc0 rt, rd

0x10

0

rt

rd

0

mfcl rt, fs

0x11

0

rt

fs

0

mtc0 rd, rt

0x10

4

rt

rd

0

mtc1, rd, fs

0x11

4

rt

fs

0

movn rd, rs, rt

0

rs

rt

rd

0xb

movz rd, rs, rt

0

rs

rt

rd

0xa

movf rd, rs, cc

0

rs

cc

0

rd

0

1

movt rd, rs, cc

0

rs

cc

1

rd

0

1

 

6 bits

5 bits

3 bits

2 bits

5 bits

5 bits

6 bits

Os bits de 21 a 26 das instruções de ponto flutuante usam o código 0 quando for precisão simples, e 1 para precisão dupla. Vamos agora ver vários exemplos de instruções de ponto flutuante.

Instruções de P.F.

Vamos conhecer a instrução absoluto. Veja o código Assembly MIPS abaixo:

Diferente do que vínhamos fazendo, que era usar a instrução li para carregar números imediatos, ou la para endereços de memória, aqui devemos usar lwc1 e lwc2. Além disso, como é um número real, de precisão simples ou dupla, devemos definir o tipo do dado numérico, da mesma forma que faríamos em linguagens de programação de médio e alto nível. Não é tão difícil assim não é mesmo? Basta seguir o mesmo raciocínio lógico na programação que você conhece.

Então, primeiro, declaramos o tipo de número, usando um label. Neste exemplo, numero1 é o label que leva ao valor, do tipo float, -10.5. Somente depois disso, conseguir carregar o número para um registrador. No exemplo que estamos trabalhando, eu carreguei o numero1 para o registrador $f0, que é um registrador que lida com precisão dupla. Feito isto, aí sim podemos usar o valor em alguma instrução. Ao executar esse código Assembly MIPS no MARS você verá que ele funcionará corretamente.

A instrução abs.d encontra o valor absoluto de ponto flutuante double, enquanto a instrução abs.s, encontra o valor absoluto de ponto flutuante simples. Basicamente toda as instruções de ponto flutuante tem uma versão idêntica para precisão simples, denotada por s, e precisão dupla, denotada por d. O exemplo a seguir mostra a soma entre dois valores de ponto flutuante, usando tanto precisão simples, quanto dupla.

Note que para carregar e calcular os números em precisão dupla, eu usei os registradores pares, e para a precisão simples, usei os registradores ímpares. Também usei a palavra chave double para indicar números de precisão dupla. O exemplo a seguir mostra como usar a instrução de comparação igual.

A seguir, apresento vários com todas as instruções de ponto flutuante, tanto para precisão simples, quanto para precisão dupla. Se você quiser ver o resultado no console, você deve usar as chamadas do sistema para isto, conforme mostrei no artigo sobre o FOR. Isto pode dar um pouco mais de trabalho, mas é interessante fazer para treinar seu conhecimento.

Código de conversão entre precisão simples e dupla:

Código de conversão de números inteiros para precisão simples e dupla:

Convertendo para número inteiro

Divisão:

Multiplicação:

Subtração:

Raíz Quadrada:

Truncamento:

Conclusão

Para o artigo não ficar muito longo e cansativo, termino o assunto aqui. No próximo artigo veremos como trabalhar com as instruções de load/store e também arrays.

Outros artigos da série

<< Compilando o comando FOR no MIPSConvertendo Código de Máquina em Assembly MIPS – Parte 1 >>
Website | Veja + conteúdo

Atuo como Professora de Informática e Computação desde 2001, atendendo de forma especial a Terceira Idade e Concurseiros. Desde 2009 venho atuando como Docente no Ensino Superior em diversos cursos de Graduação e Pós Graduação Lato Sensu, tanto presenciais, quanto semipresenciais e à distância. Ministrei várias disciplinas onde ensino os estudantes a desenvolverem plataformas e sistemas computacionais. Orientei vários trabalhos acadêmicos, desenvolvi inúmeros materiais, trabalhei com pesquisa, ensino, extensão e inovação, ministrei palestras em vários eventos. Mais recentemente venho ofertando serviços na área de tecnologia como desenvolvimento de sistemas, treinamentos, consultoria, mentoria, etc. Comecei meu Doutorado na área de Machine Learning (Multi-label Classification) na UFSCar em 02/2019 e devo terminar em 01/2023. Também estudo canto, jogo vôlei, sou geek, nerd, otaku e gamer!

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

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

Comentários:
Notificações
Notificar
guest
3 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Bruno Wilson
Bruno Wilson
22/09/2019 17:40

Sdds o próximo artigo, kkkkkkkkkk. Muito bacana esse artigo!

Talvez você goste:

Séries



Outros da Série

Menu