nasm division d'un nombre en facteur de nombre premier
Je dois réaliser l'équivalent de la commande factor en assembleur nasm.
Voila ce que j'ai effectué pour le moment (j'ai pris comme valeur pour essayer 10):
Le problème est que mon dernier diviseur vaut 0, ce qui n'est pas cohérent... (j'ai déroulé mon algo sur papier et il y a pas de soucis).
Je pense que ça doit venir du fait que j'utilise push, et pop. (Je ne maitrise pas trop la pile...).
Par ailleurs j'ai fait un affichage de eax dans division pour tester une fois avant celui de ebx et une fois apres et la encore je trouve 2nombres différents. (10 lorsque je le fais avant, et sinon 3). Le premier affichage de ebx s'effectue par contre correctement. On affiche bien 2.
Code:
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
|
SECTION .data
extern printf
global debug
msg db ' %d',10,0
msg2 db 'dernier diviseur => %d',10,0
SECTION .text
debug:
mov eax, [esp + 4] ; notre nombre n est dans eax
mov ebx,2 ; on commence notre recherche par le premier nombre premier
jmp debut
debut:
cmp eax,ebx
je fin ; si les 2nombres sont egaux rien a faire je = jump if equal
cmp ebx,eax ; si diviseur
jng boucle ; < a notre nombre alors on commence a cherche les facteurs
jmp fin
boucle:
div ebx ; on divise eax par ebx
mov ecx,edx ; on recupere le reste dans ecx
mul ebx ; on remet n (eax) a sa valeur de depart
add eax,ecx ; on ajoute le reste de la division qui manqué
mov edx,0 ; pour tester si le reste est egal a 0
cmp ecx,edx ; si le reste est egal a 0 on a trouve un facteur premier
je division ; on continue donc
inc ebx ; sinon on incremente ebx
jmp debut ; et on recommence la boucle
division:
push ebx ; on affiche le premier facteur premier qui est ebx
push msg
call printf
pop ebx
div ebx
mov ebx,2 ; la division a marché on remet le diviseur a 2
jmp debut ; on retourne au debut
fin:
push eax
push msg2
call printf ; on affiche le dernier diviseur |