Jump to content
Sign in to follow this  
Ribeiro

Problema no código

Recommended Posts

Estou desenvolvendo alguns exercícios em assembly mips, e um deles é basicamente:

 

23. Faça um algoritmo que leia dois valores correspondentes a anos e mostre quais os anos não bissextos existem entre eles. (A diferença entre os anos não pode ser maior que 1000)

 

.data
    msg1: .asciiz "\nEntre com a primeira data: "
    msg2: .asciiz "\nEntre com a segunda data: "
    msg3: .asciiz "\nPrimeira data deve ser menor e o intervalo entre ela não pode exceder 1000."
    msg4: .asciiz "\nEsses são os anos não bissestos: "
.text
main:
     #Chamando msg1
     li $v0, 4
     la $a0, msg1
     syscall
     
     #Armazenando primeira entrada do usuario
     Ler:
     li $v0, 5
     syscall
     add $t0, $v0, $zero
     
     #Chamando msg2
     li $v0, 4
     la $a0, msg2
     syscall
     
     #Armazenando segunda entrada do usuario
     li $v0, 5
     syscall
     add $t1, $v0, $zero
     
     add $t2, $t0 , 1000
     bgt $t1, $t2, erro
     ble $t1, $t0, erro
     
     j enquanto
    
     #Chamando msg3
     erro:
     li $v0, 4
     la $a0, msg3
     syscall
     
     j Ler
      
     enquanto:
     add $t2, $t0, 1
     sub $t3, $t1, 0
     bgt $t3, $t2, se
     
     enquanto2:
     bgt $t3, $t2, se
     
     j Resultado
     
     #Calculando o resto de n1
     se:
     rem $t4, $t2, 4
     beq $t4, 0, naocontador
     
     #Anos não Bissextos
     add $t5, $t5, 1
     
     #Contador do n1
     naocontador:
     add $t2, $t2, 1
     
     j enquanto2
     
     Resultado:
     li $v0, 4
     la $a0, msg4
     syscall
     
     li $v0, 1
     add $a0, $t5, 0
     syscall
     
     #Zerando $t5
     sub $t5, $t5, $t5

Share this post


Link to post
Share on other sites

Recomendo instalar um cross compiler no seu PC (gcc-8-mips-linux-gnu, no Linux) e dar uma olhada no código em ASM gerado por esse códigozinho:
 

// test.c
// Compile com mips-linux-gnu-gcc-8 -O2 -S test.c
//    acrescente -DDEBUG para que a função leapyear() não fique inline.

// Será definida em outro lugar para não poluir o
// assembly gerado.
extern void show_year( int );

#ifdef DEBUG
__attribute__((noinline))
#endif
static int leapyear( int year )
{
  // anos bissextos não são simplesmente aqueles divisíveis por 4 apenas!
  // Os anos divisíveis por 4 (e não por 100) e os anos divisíveis por 400 é que são bissextos.
  return ( ! ( year % 4 ) && ( year % 100 ) ) || ( ! ( year % 400 ) );
}

// A função assume que ystart é menor ou igual a yend.
void show_nonleapyears( int ystart, int yend )
{
  int i;

  for ( i = ystart; i <= yend; i++ )
    // Só mostra os anos não-bissextos.
    if ( ! leapyear( i ) )
      show_year( i );
}

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...