Jump to content

Problema no código


Ribeiro

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

Link to comment
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 );
}

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...