;EasyCodeName=Module1,1 .Const .Data NUM DQ 0 .Code start: ;Inicio del programa principal. invoke puts, "----- Programa para comprobar si un numero es perfecto -----" invoke puts, " " invoke printf, "----- Introduzca un numero entero positivo : " invoke scanf, "%d", Addr NUM invoke puts, " " mov ebx, 2 ;Para dividir el número entre dos y así no comprobar números superiores a su mitad mov eax, [NUM] ;Introducimos el número en eax mov edx, 0 ;Para poder usar DIV sin problemas div ebx ;Lo dividimos entre dos mov ecx, eax ;Almacenamos el cociente en ecx para que sirva de contador para LOOP mov edi, 1 ;Contendrá los candidatos a divisores mov esi, 0 ;Para ir sumando los divisores comprobar: mov eax, [NUM] ;Introducimos el numero en eax para DIV div edi ;Dividimos el número entre el candidato a divisor cmp edx, 0 ;Comprobamos si el resto es cero jne > siguiente ;Salta si el resto no es cero add esi, edi ;Sumamos el divisor encontrado siguiente: inc edi ;Incrementamos en uno el candidato a divisor mov edx, 0 ;Eliminamos el posible resto almacenado para poder utilizar DIV loop comprobar ;Iteramos mientras no se comprueben todos los números entre 1 y NUM/2. cmp [NUM], esi ;Comprobamos si la suma de los divisores es igual al número introducido jne > no_perfecto ;Saltamos si no son iguales invoke puts, "----- El numero introducido es perfecto " jmp > fin no_perfecto: invoke puts, "----- El numero introducido no es perfecto " fin: invoke puts, " " Invoke system, "pause" Xor Eax, Eax Invoke ExitProcess, Eax ;Fin del programa principal ;Subprogramas: