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