Salve ragazzi,
So che può essere insolito leggere problemi che come soggetto abbiano il linguaggio di programmazione assembler ma ultimamente mi e' capitato di dover aiutare mio nipote alle superiori.
L'ho studiato anche io (circa 14 anni fa XD) quindi tra trapassato, memoria e passaggi poco chiari qualcosa proprio non mi torna... in particolare su questo programma per l'8086 dove si utilizzano soltanto le istruzioni di MOV ed i vari JUMP

il problema è il seguente, si hanno 20 numeri (Byte) a partire dal registro 0200
e di questi 20 numeri si vogliono sapere quanti sono 0 e quanti <> 0 il risultati vanno posti nei registri 0300 e 0301.
Nel registro BX inseriremo proprio 0200 e nei DL e CH i risultati che andranno in 0300 e 0301
In CL inseriamo il numero di confronti da effettuare (abbiamo detto 20 numeri quindi 14 in esadecimale)

l'idea sarebbe quella di valutare il primo elemento se 0 incrementare DL altrimenti incrementare CH, Decrementare CL e ripetere la cosa finché CL non diventa 0

fin qui tutt'ok ma il codice in alcune parti proprio non mi è chiaro e ve lo riporto:

1 Mov BX, 0200
2 Mov CL, 14
3 Mov DL, 0
4 Mov CH, 0 ;fino a qui tutto chiaro azzeriamo i due registri e mettiamo 0200 e 14 (20in decimale in CL
5 Mov AL, [BX] ; mettiamo in AL il contenuto del registro BX (AL in teoria è 8 bit mentre il contenuto di BX non dovrebbe essere a 16 bit?)
6 Mov AL, 00 ; che senso ha se si e' appena inserito il contenuto di BX?
7 JE5 ;Salta se operatore1 = operatore2 (questo salto non mi e' chiaro)
8 INC DL
9 INC BX
10 DEC CL
11 JNE 5 ; Salta se l'operatore1 <> operatore2 (se flag zero è 0)
12 MOV [0301], DL
13 MOV [0300], CH ; mette i risultati nei rispettivi registri
14 INT 20 ;e in questo caso finirebbe il programma
15 INC CH ; altrimenti incrementa CH (dovrebbe essere)
16 JMP 9
17 INC BX
18 DEC CL ; passiamo al numero successivo e decrementiamo i numeri da confrontare
19 JNE 5
20 MOV [0300], CH
21 INT 20

se qualcuno mi chiarisse le idee (mi rinfrescherebbe alla grande la memoria XD) ne sarei veramente grato