MIPS: Subtração e outras instruções

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

Oi pessoal!!! Nos artigos anteriores eu mostrei a vocês as instruções MIPS de Multiplicação e Divisão. Hoje aprenderemos mais sobre instruções aritméticas MIPS. Preparados?

 

 

Subtração com overflow

 

Sub = Subtract Word (Subtrair palavra). O valor da palavra de 32 bits no registrador RT é subtraído do valor de 32 bits no registrador RS para produzir um resultado de 32 bits. Se a subtração resultar em estouro aritmético (overflow) do complemento de 2 de 32 bits, o registrador de destino não será modificado e ocorrerá uma exceção de Integer. Se não houver overflow, o resultado de 32 bits será colocado no registrador rd.

 

Sintaxe: sub rd, rs, rt

 

Formato:

opcode

rs

rt

rd

shamt

funct

000000

 

 

 

 

0x22

6 bits

5 bits

5 bits

5 bits

5 bits

6 bits

 

 

Exemplo:

 

 

Figura:

 

Como podemos notar pelo Exemplo, a instrução SUB funciona da mesma forma que a instrução ADD e nós já a estudamos em outros artigos!

 

 

Subtração sem overflow

 

 

O valor da palavra de 32 bits no registrador RT é subtraído do valor de 32 bits no registrador RS e o resultado aritmético de 32 bits é colocado registrador RD. Nenhuma exceção de estouro de número inteiro ocorre sob nenhuma circunstância.

 

 

Sintaxe: subu rd, rs, rt

 

 

Formato:

opcode

rs

rt

rd

shamt

funct

000000

 

 

 

 

0x23

6 bits

5 bits

5 bits

5 bits

5 bits

6 bits

 

 

Exemplo:

 

 

Figura:

 

 

 

Valor Absoluto

 

Essa instrução é na verdade uma pseudoinstrução. Caso você não saiba o que é valor absoluto, aqui você pode encontrar uma explicação.

 

 

Sintaxe: abs r_destino, r_source

 

 

Exemplo:

 

 

 

 

Figura:

 

 

O número -10 em hexadecimal é fffffff6, o qual é armazenado no registrador $s2 (ou registrador $18). O registrador $s1 é o $17 e o registrador $s2 é o $18. Vejamos o que acontece no MARS:

 

Na primeira linha vemos a instrução ADDIU que faz uma soma do número imediato 0xfffffff6 (-10) com o valor zero do registrador $0 (zero) e armazena o resultado no registrador $18 ($s2). Na segunda linha temos a instrução SRA que já foi explicada também no artigo sobre multiplicação. A instrução SRA executa um deslocamento aritmético à direita, de uma palavra, por um número fixo de bits, que no nosso caso aqui é o valor 0x0000001f (31). Quando executamos esta linha, o registrador $s2 tem o valor 0x000000f6, e o registrador $1 passa ter o valor 0xffffffff. Na terceira linha temos a instrução XOR que é uma operação lógica. XOR significa exclusive or (ou exclusivo) e tem a seguinte tabela verdade:

 

 

E1

E2

S

0

0

0

0

1

1

1

0

1

1

1

0

 

 

 

Onde E1 é entrada 1, E2 é entrada 2 e S é saída. Quando a entrada E1 for zero e a entrada E2 também for zero, a saída será zero. Observe que quando a E1 for um, e a E2 também for um, a saída também será zero. Note também que quando E1 é igual zero e E2 é igual a um, a saída é um, e quando E1 é um e E2 é zero, a saída também é um. Isso significa que, quando as entradas forem iguais, a saída será zero e, quando as entradas forem diferentes a saída será um. Esse é o comportamento da XOR.

 

 

Em nosso exemplo será executada uma operação XOR entre os registradores $1 e $18, os quais valem no momento da execução 0xffffffff e 0xffffff6, que vai resultar no valor 0x00000009, o qual é armazenado no registrador $17. Por fim, na quarta linha, é executada a instrução sub entre os valores armazenados nos registradores $17 (0x00000009) e $1 (0xffffffff) e o resultado, 0x0000000a (10), é guardado em $17.

 

A operação XOR combina o conteúdo do registrador RS e do registrador RT em uma operação exclusiva de bit a bit (bitwise) lógica e coloca o resultado no registrador RD. Em termos mais simples seria algo como RD = RS XOR RT, onde sabemos que RD é o registador destino (nosso S da tabela verdade) e RS e RT são os registradores fonte (nosso E1 e E2 da tabela verdade). O formato da instrução XOR é:

 

 

Formato:

opcode

rs

rt

rd

shamt

funct

000000

 

 

 

 

100110

6 bits

5 bits

5 bits

5 bits

5 bits

6 bits

 

 

É dessa foram que se obtém o número absoluto em linguagem assembly MIPS. Vamos ver um exemplo com o número +10 (que é A em hexadecimal):

 

 

 

Note que a execução ocorreu exatamente da mesma forma que antes!

 

 

Contar uns iniciais

 

clo = Count Leading Ones in Word (Conte os uns iniciais na palavra). O objetivo desta instrução é contar os uns iniciais em uma palavra. Os bits de 31 até 0 do registrador geral RS são escaneados do bit mais significativo para o menos significativo. O número de uns iniciais é contado e o resultado é gravado no registrador RD. Se todos os bits de 31 até 0 foram configurados no registrador RS, o resultado será gravado no registrador RD.

 

Um detalhe importante: para estar em conformidade com a arquitetura MIPS32 e MIPS64, o software deve colocar o mesmo número de registrador nos campos RT e RD da instrução. A operação da instrução é IMPREVISÍVEL se os campos RT e RD da instrução contiverem valores diferentes.

 

Sintaxe: clo rd, rs

 

 

Formato:

opcode

rs

rt

rd

shamt

funct

0x1c

 

0

 

0

0x21

6 bits

5 bits

5 bits

5 bits

5 bits

6 bits

 

 

Exemplo:

 

 

 

Figura:

 

 

No MARS você notará que a quantidade de uns será armazenada no registrador $17, que neste caso será 0x0000001c. Teste com outros números e veja o acontece.

 

 

Contar zeros iniciais

 

clz = Count Leading Zeros in Word (Conte os zeros iniciais na palavra). O objetivo desta instrução é contar os zeros iniciais em uma palavra. Os bits de 31 até 0 do registrador geral RS são escaneados do bit mais significativo para o menos significativo. O número de zeros iniciais é contado e o resultado é gravado no registrador RD. Se todos os bits de 31 até 0 foram configurados no registrador RS, o resultado será gravado no registrador RD.

 

Um detalhe importante: para estar em conformidade com a arquitetura MIPS32 e MIPS64, o software deve colocar o mesmo número de registrador nos campos RT e RD da instrução. A operação da instrução é IMPREVISÍVEL se os campos RT e RD da instrução contiverem valores diferentes.

 

Sintaxe: clz rd, rs

 

 

Formato:

opcode

rs

rt

rd

shamt

funct

0x1c

 

0

 

0

0x20

6 bits

5 bits

5 bits

5 bits

5 bits

6 bits

 

 

Exemplo:

 

 

 

 

Figura:

 

 

 

No MARS você notará que a quantidade de zeros será armazenada no registrador $17, que neste caso será 0x0000001c. Teste com outros números e veja o que acontece.

 

 

Negar valor com overflow

 

Esta instrução realiza a negação de um número hexadecimal.

 

Sintaxe: neg r_destino, r_source

 

Exemplo:

 

 

Figura:

 

Subtração

 

 

 

Negar valor sem overflow

 

Esta instrução realiza a negação de um número hexadecimal. A diferença desta instrução para a anterior é apenas o fato de que esta não trata overflow, enquanto que a NEG trata o overflow. Atente-se para o opcode dado na execução do MARS conforme mostra a Figura.

 

Sintaxe: negu r_destino, r_source

 

Exemplo:

 

 

Figura:

 

Subtração

 

 

Resto

 

Esta pseudoinstrução coloca o resto do registrador r_source1 dividido pelo registrador r_source2 no registrador r_destino.

 

Sintaxe: rem r_destino, r_source1, r_source2

 

Exemplo:

 

Figura:

Subtração

 

A pseudoinstrução REM, e a REMU, a seguir, abrem uma sequencia de instruções que incluem BNE, BREAK, DIVU e MFHI, todas elas nós já estudamos. Como exercício, vou pedir para que vocês tentem compreender o que está acontecendo, já que as instruções são conhecidas! Deixem suas dúvidas nos comentários tá bom.

 

Resto sem sinal

 

Esta pseudonstrução coloca o resto do registrador r_source1 dividido pelo registrador r_source2 no registrador r_destino. Se um operando for negativo, o resto não é especificado pela arquitetura MIPS e depende da convenção da máquina.

 

Sintaxe: remu r_destino, r_source1, r_source2

 

Exemplo

 

Figura:

Subtração

 

Conclusão

 

Por hoje é só pessoal! Mas continuem atentos, em breve mais artigos com mais instruções!

Outros artigos da série

<< MIPS: Instruções de DivisãoCompilando o comando FOR 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.

Deixe um comentário

avatar
 
  Notificações  
Notificar