Ciao, gianpixel.
Scusa il ritardo, ma appena adesso ho avuto un po'di tempo da dedicare ad un'analisi del tuo codice nel dettaglio, poiché ieri sono uscito a cena. Magari a te non serve più, ciononostante posto comunque la risposta in quanto potrebbe essere interessante anche per altri utenti del Forum.
Ecco i risultati (le istruzioni <b>inutili</b> sono contrassegnate con il simbolo <b>(?)</b>, le mie osservazioni sono riportate in <b>grassetto</b>):<code>.model small
.stack
.data
max_len equ 5
msg1 db 10,13,"Inserisci un numero",10,13,'$'
msg2 db 10,13,"I numeri pari sono",10,13,'$'
msg3 db 10,13,"I numeri dispari sono",10,13,'$'
msg4 db 10,13,"Errore,inserisci un numero",10,13,'$'
pari db max_len dup(?)
dispari db max_len dup(?)
.code
start:
mov cx,max_len
leggi:
xor bx,bx
xor dx,dx ; azzero dx e visualizzo il primo msg
mov ax,seg msg1
mov ds,ax
mov dx,offset msg1
xor ax,ax
mov ah,09h
int 21h
mov ah,01h ; leggo i caratteri da tastiera
int 21h
xor si,si ; <b>(?)</b>
sub al,30h
mov dl,al
mov dh,0
push dx
loop leggi
call paridispari
add sp,10
jmp fine
paridispari proc near
push bp ; zavorra! <b>(perchè "zavorra"? questa è la</b>
mov bp,sp ; <b><i>standard entry sequence</i> della procedura!)</b>
xor cx,cx ; <b>(?) queste due istruzioni acquistano un senso solo</b>
push cx ; <b>(?) se le scambi di posizione!</b>
mov cx,[bp+4] ; inizializzo il contatore a 5 <b>(ERRORE: qui tu</b>
; <b>inizializzi cx con il valore dell'ultimo numero</b>
; <b>accettato in input dal programma chiamante!)</b>
xor si,si ; <b>(?) queste due istruzioni acquistano un senso solo</b>
push si ; <b>(?) se le scambi di posizione!</b>
altro_elem:
xor ax,ax
xor bx,bx
mov al,[bp+10] ; metto il primo valore salvato in al <b>(qui il valore</b>
; <b>di scostamento dovrebbe essere 12; inoltre, per</b>
; <b>recuperare il valore corretto dallo stack dovresti</b>
; <b>usare ax al posto di al, in quanto lo stack procede</b>
; <b>di 16 in 16 bits!)</b>
add si,2 ; incremento si
mov bl,2
div bl
dec cx ; <b>in conseguenza del valore assegnato precedentemente</b>
; <b>a cx, quest'istruzione non sortisce l'effetto voluto!</b>
cmp ah,0
jz vispari
jnz visdispari ; <b>(?)</b>
visdispari: ; <b>(?)</b>
mov dispari[di],al ; metto il valore nel vettore pari e incremento l'indice
inc di ; <b>(ERRORE: di non è mai stato appropriatamente inizializzato!)</b>
cmp cx,0 ; <b>in conseguenza del valore assegnato precedentemente</b>
; <b>a cx, quest'istruzione non sortisce l'effetto voluto!</b>
je dollaro2
jne altro_elem ; <b>qui è sufficiente un semplice jmp</b>
vispari:
mov pari[si],al ; metto il valore nel vettore pari e incremento l'indice
inc si
cmp cx,0 ; <b>in conseguenza del valore assegnato precedentemente</b>
; <b>a cx, quest'istruzione non sortisce l'effetto voluto!</b>
je dollaro1
jne altro_elem ; <b>qui è sufficiente un semplice jmp</b>
dollaro1:
xor dx,dx
mov al,'$'
mov pari[si],al ; nell'ultima postazione metto il carattere $
mov dx,offset msg2 ; stampa la stringa msg2
mov ah,09h
int 21h
xor dx,dx
mov ah,09h
lea dx,pari ; stampa il vett pari come stringa
int 21h
dollaro2:
xor dx,dx
mov al,'$'
mov dispari[di],al
mov dx,offset msg3
mov ah,09h
int 21h
xor dx,dx
mov ah,09h
lea dx,dispari
int 21h
fineproc:
<b>pop si</b> ; <b>quest'istruzione è necessaria per riequilibrare lo stack</b>
; <b>ma nel tuo codice manca!</b>
<b>pop cx</b> ; <b>quest'istruzione è necessaria per riequilibrare lo stack</b>
; <b>ma nel tuo codice manca!</b>
pop bp
ret
paridispari endp
fine:
mov ah,4ch
int 21h
end start</code>Gli errori logici in cui sei incorso dovrebbero esserti, ora, piuttosto chiari.
Inoltre, poiché usi TASM come assembler, quanto ti ho detto ieri sulle aggiunte (<b>ds:</b>) da fare ai <i>memory operands</i> che ti ho indicato non è più vincolante.
Ciao e buono studio!