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: |
Partager