Bonjour à tous!

J'ai fait un petit programme qui provoque de gros plantages.
Dans le meilleur des cas il ne fait rien et j'ai un écran noir ou alors il entre dans une boucle infinie et m'affiche des zéros mais des fois ca peut être franchement génant : tout à l'heure il a complètement bloqué le pc en le faisant bipper indéfiniment. (impossible de killer le processus, j'ai du appuyer sur le bouton off)

Bref comment pourrais-je vérifier ce que fait mon programme pour mieux retrouver l'erreur? Et pourquoi des comportements si différents?

De plus, pourriez vous m'expliquer pourquoi les premières instructions ne s'executent pas normalement? (le premier message ne s'affiche plus et je ne vois pas pourquoi)
Pourquoi, selon que je commente ou non certaines des dernières instructions, le début du programme est affecté? (par exemple, le "jnz for_display" a une influence sur l'affichage du message d'accueil)

Enfin, question qui n'a que peu de rapport avec le sujet, que fait l'assembleur quand je définis une stack de 0 octets? (j'ai un warnin mais le programme marche)

Merci d'avance

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
[BITS 16]
 
SEGMENT data
welcoming db "Computing seeves...",10,13,"$"
debug     db "This part works...",10,13,"$"
seeve     times 100 db 1 
 
 
SEGMENT code
..start:
 
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
 
mov dx,welcoming
mov ah,9
int 0x21
 
mov [seeve+0*1],byte 0
mov [seeve+1*1],byte 0 ; chaque scalaire fait un octet et on veut l'élément numéro 1 (le deuxieme)
;------------------------
;On élimine les multiples
;------------------------
mov dl, byte 1 ; le premier mutiplicateur doit être 2 et non 1
mov al, byte 2 ; un indice arbitraire qui sera changé
for_multiple:
inc dl ; on incrémente le muliplicateur à chaque boucle. La première fois, il sera à 2
mul dl ; ax=al*dl => AL est l'indice, DL le multiplicateur
mov bx,ax
mov [seeve+bx*1],byte 0 ; ax doit contenir l'indice d'un premier multiplié par 2 ou plus. 
                        ;Le 1 ne sert qu'à rappeler que j'utilise un chaine d'éléments
						;qui ne font qu'un seul octet. 
cmp dl,100 ; la valeur max des nb premiers est pour l'instant hard codée
jnz for_multiple ; tant que bx!=100,on recommence
;-------------------------
mov dx,debug
mov ah,9
int 0x21
 
xor bx,bx
mov ah,2 ; pour afficher un caractere (pas une chaine terminée par '$')
for_display:
cmp [seeve+bx],byte 1 ; 1=premier /!\ on Compare un octet, pas un mot
inc bx
;------------
jnz for_display ; si la comparaison est fausse, on n'affiche pas et on passe au suivant
;------------
mov dl,bh ; on veut imprimer le premier chiffre (donc dans les 8 bits de poids le plus fort)
add dl,'0' ;on veut afficher le nombre, pas le caractère ascii auquel il correspond.
int 0x21 
mov dl,bl ; on affiche le 2eme  chiffre
add dl,'0' 
int 0x21
jmp for_display
 
 
mov ah,4Ch
int 0x21
 
SEGMENT stack stack
	resb 16 
	top: