• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Lophes

Calcular numero primo em assembly

14 mensagens neste tópico

Estou com um trabalho em mãos que consiste em criar uma programa na linguagem assemby que me permita ao inserir um numero este me diga se é primo ou não. Eu sou iniciante em programação e como tal estou com algumas dificuldades e agradecia se me pudessem ajudar e dar umas dicas como fazer o programa. Desde já agradeço a ajuda.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um número N é primo se não tiver nenhum divisor no intervalo [2,sqrt(N)].

sqrt(N) = raiz quadrada de N.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como em assembly não consegues calcular directamente uma raíz quadrada, sugiro que penses no algoritmo para o fazer com subtracções.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como em assembly não consegues calcular directamente uma raíz quadrada, sugiro que penses no algoritmo para o fazer com subtracções.

Consegues no FPU (Floating-Point Unit).  :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Consegui fazer o programa em C:

#include <stdio.h>

main()

{

      int p=0,i,n;

      printf("Introduza um Numero: ");

      scanf("%d",&n);

      i=1;

      while (i<=n)

      {

            if ((n%i)==0)

              p=p+1;

              i=i+1;

              }

             

              if (p==2)

              printf("O numero e primo.");

             

              else

              printf("O numero nao e primo.\n");

              system ("pause");

      }

Pelo que estive a ver tudo isto é possível codificar em assembly, agora o meu problema é como vou puder gerir a relação entre os comandos (while e if) em assembly. Se alguém me puder ajudar agradeço.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens de usar os jumps: je, jle, jg, jge, je.

Ou então chegas agora e fazes um: gcc -s prog.c e ficas com um ficheiro assembly. :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só dá para fazer essa conversão no gcc ?? Eu estou usando o dev c++ neste compilador não dá tb para fazer isso??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O compilador do Dev-C++ é o MinGW, que é um port do GCC para Windows, por isso não sei. Só se der invocando apenas por linha de comandos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

    Testei com um exemplo muito simples "Hello Word" e o parametro -s em linha de comandos funcionou lindamente. Estou a usar o DevC++ em Windows XP SP3.

Cordiais cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, apocsantos desculpe a minha ignorância mas não estou conseguindo fazer isso, podia por mais pormenorizado o que fez para converter o programa.

Desde já agradeço, com os melhores cumprimentos. 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

    Na linha de comandos, do windows, muda de directorio até ao directorio onde tiveres o gcc.exe, copia para lá o ficheiro .C teuprograma.c, e usa exactamente o parametro -s.

c:\GCC\>gcc -s teuprograma.c 

    Comigo resultou, com o exemplo hello_world.c

Cordiais cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ola Bom dia,

Uma solução possível e utilizares o comando DIV.  Por exemplo:

mov BL, 2

mov AX, 5  --- AX e composto por (AH,AL) 

div BL        --- a operação e sempre feita em AX (AH guarda resto e AL guarda quociente)

Portanto este caso AH = 1  AL = 2...

Então o que podes fazer logo para excluir os numeros pares, e fazer isto e verificar se o AH = 1, logo se for tens um numero impar. 

Passos seguintes e fazeres um contador que vá experimentando os números ímpares ate ao introduzido e verifique se o AH = 0, se for e porque não e primo senão for 0 ate ao numero que tu tens e pk e. Exemplo:

7

pegas fazes um contador que comece no 3 e vais dividindo.

7/3 - resto = 1 ----  como o AH <> 0 -- seguinte

7/5 - resto = 2 ---    AH<>0

agora o numero seguinte era o 7 , como já sabes que e primo não precisas de fazer +,  o teu contador vai ate NUM-2.

Espero ter ajudado, pra facilitar fazes 2 ciclos distintos o 1ª pra excluir os pares qd tiveres esse a funcionar o 2º pra excluir impares.

Se o numero introduzido "escapar" a estes 2 ciclos e pk e primo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, desde já agradeço a tua dica, mas não estou a conseguir acompanhar o teu raciocinio. Deixo aqui o codigo que consegui fazer. Se alguem me puder ajudar agradeço.

mov r0, #4 ;n adicionar 

mov r1, #2

mov r7, #10

mov A, r0

mov B, r1

DIVISAO:            div AB

mov r3,A ;

mov r4,B ; resto

IF: JC verd

Verd:                inc r5

ELSE:                JNZ fals

fals:                  dec r7

SJMP DIVISAO

P.S. Isto é focado para o  microprocessador 8051.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora