Ribeiro Postado Novembro 23, 2019 em 06:39 Compartilhar Postado Novembro 23, 2019 em 06:39 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 para o comentário Compartilhar em outros sites More sharing options...
fredericopissarra Postado Novembro 23, 2019 em 13:02 Compartilhar Postado Novembro 23, 2019 em 13:02 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 para o comentário Compartilhar em outros sites More sharing options...
Ribeiro Postado Novembro 25, 2019 em 01:35 Autor Compartilhar Postado Novembro 25, 2019 em 01:35 Agradeço. Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
Arquivado
Este tópico foi arquivado e está fechado para novas respostas.