Ricerca numeri primi con algoritmo ricorsivo

di il
2 risposte

Ricerca numeri primi con algoritmo ricorsivo

Dopo i primi esercizi introduttivi sto cercando di farne qualcuno leggermente più impegnativo.
Ho l'esigenza di stabilire se un intero a 16 bits è primo o meno e vorrei utilizzare un algoritmo ricorsivo. Dato il numero n lo divido per (n-1), poi per (n-2) e così via fino a quando arrivo alla divisione di n per 2. Controllo i resti e se sono sempre diversi da zero il numero è primo altrimenti l'algoritmo si arresta al primo resto nullo in corrispondenza del quale n non è primo.

Ecco il testo:

Realizzare in linguaggio assemblativo ix86 una procedura in grado di determinare, dato un intero 'n' a 16 bits positivo fornito come parametro, se lo stesso è primo o meno. La procedura, richiamabile da un programma esterno deve restituire 1 se il numero è primo, 0 se non lo è e -1 in caso di input non ammissibile. Scrivere anche un segmento di codice assembly che richiama la procedura passandole l'opportuno parametro.

Ecco la mia soluzione:

**PARTE CHIAMANTE**

NUMERO DW 7 <----- qui devo specificare un valore o posso mettere n?
EXTERN _PRIME
MOV AX, NUMERO
PUSH AX
CALL _PRIME

**PROCEDURA**

PUBLIC _PRIME
.MODEL SMALL
.STACK
.DATA
PRIMO DB "1$"; il numero immesso è primo
NOPRIMO DB "0$"; il numero immesso non è primo
WRONG DB "-1$"; valore non ammesso
.CODE
_PRIME PROC
PUSH BP
MOV BP, SP
MOV AX, [BP+4]
MOV BX, AX
CMP BX, 1
JL ERRORE; se n<1 devo avere un messaggio di errore.

ERRORE: LEA DX, WRONG
MOV AH, 9
INT 21H

CMP BX, 2; se n=1 oppure n=2 essi sono primi e la procedura termina.
JLE FINEP
PUSH BX
MOV CX, BX
DEC CX
DEC CX; devo fare n-2 iterazioni.

CICLO: XOR DX, DX; azzero il registro DX; il ciclo ha senso per n>2
DEC BX; ad ogni iterazione n diminuisce di 1
DIV BX; faccio n/(n-1)
POP AX; ripristino dallo stack il valore di AX sovrascritto dalla divisione.
CMP DX, 0; se alla fine di tutte le iterazioni DX non è zero allora n è primo.
JE FINENP
LOOP CICLO

FINEP: LEA DX, PRIMO
MOV AH, 9
INT 21H

FINENP: LEA DX, NOPRIMO
MOV AH, 9
INT 21H

POP BP
RET
_PRIME ENDP
END

Poiché sono ancora alle prime armi mi piacerebbe sapere se la procedura è corretta oppure quali sono gli errori. Grazie per il tempo che mi dedicate.
alfredo66

2 Risposte

  • Re: Ricerca numeri primi con algoritmo ricorsivo

    Allora per definire una variabile senza assegnargli un data basta che fai
    nome variabile dw ?
    poi un consiglio che ti posso dare e:
    non usare il loop per effettuare il ciclo ma usa la combina cmp je cosi potrai uscire dal ciclo in ogni momento.
    lo stack non ti serve a me no che non ti sia stato richiesto esplicitamente.
    per accettare un carattere da tastiera basta che usi ah=1 int 21h
    il dato ti sarà restituito nel registro al
    bada bene che il carattere restituito sarà il codice ascii del tasto premuto quindi lo dovrai trasformare in dato.
    per far cio basta che tu sottragga 30h al registro al
    quindi sub al,30h così avrai il numero da utilizzare nella tua funzione.
    se ti servono ulteriori chiarimenti chiedi pure
    spero di esserti stato di aiuto.
  • Re: Ricerca numeri primi con algoritmo ricorsivo

    Grazie, i tuoi suggerimenti sono molto apprezzati. Correggo subito il codice e lo provo con l'emulatore. A presto.
Devi accedere o registrarti per scrivere nel forum
2 risposte