Reglage resultat sortant d'une procedure

Pour discuter de l'assembleur
Avatar de l’utilisateur
Ganagyre
Messages : 67
Inscription : jeu. 09/nov./2006 13:41
Localisation : PACA

Reglage resultat sortant d'une procedure

Message par Ganagyre »

Bonjour à tous.

Voila j'utilise dans un code une procedure Combinaisons / C(n,p):
(sans doute issue du forum, je n'ai pas retrouve le post si tel est le cas)

Code : Tout sélectionner

Procedure.d Combinations(n.l, p.l) 

  ;si n négatif pas de combinaisons
  !TEST dword [p.v_n], $80000000
  !JNE  l_combinations_end
 
  ;si p négatif pas de combinaisons
  !TEST dword [p.v_p], $80000000
  !JNE  l_combinations_end
 
  ;si n inférieur à p pas de combinaisons
  !MOV eax, dword [p.v_n]
  !CMP eax, dword [p.v_p]
  !JL  l_combinations_end
 
  !FLD1 ;résultat dans st0
    
  ;si p > n/2
  !SHR eax, 1
  !CMP eax, dword [p.v_p]
  !JG l_combinations_loop
 
  ;on prend n - p à la place de p
  !MOV eax, dword [p.v_n]
  !SUB eax, dword [p.v_p]
  !MOV dword [p.v_p], eax
 
  combinations_loop:
  ;tant que p > 0
  !CMP dword [p.v_p], 0
  !JLE l_combinations_end_loop
 
  ;calcule les combinaisons
  !FIMUL dword [p.v_n]
  !FIDIV dword [p.v_p]
  !DEC   dword [p.v_n]
  !DEC   dword [p.v_p]
 
  !JMP l_combinations_loop
  combinations_end_loop:
 
  !FRNDINT
  combinations_end:
 
  !RET 8
EndProcedure

Cela fonctionne bien tant que n>=p, et que les valeurs soient positives.
Dans mon utilisation de cette procedure, il arrive parfois que les valeurs p ou n données fournissent un resultat negatif ou donnant "-1.#IND".

Comment modifier le code ASM pour avoir comme resultat 0, si le calcul ne donne pas une resultante positive ?

Merci à tous
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Reglage resultat sortant d'une procedure

Message par PAPIPP »

Bonjour Ganagyre
Je ne sais si cela te convient
Voici un code ASM qui répond 0 dans tous les cas non positif

Code : Tout sélectionner

Procedure.d Combinations(n.l,p.l)
    !FINIT
    !FLDZ
  
  ;si n négatif pas de combinaisons
  !TEST dword [p.v_n], $80000000
  !JNE  l_combinations_end

  ;si p négatif pas de combinaisons
  !TEST dword [p.v_p], $80000000
  !JNE  l_combinations_end

  ;si n inférieur à p pas de combinaisons
  !MOV eax, dword [p.v_n]
  !CMP eax, dword [p.v_p]
;  !JL  l_combinations_end
    !JNL  l_combin_suite
    !NOP
    !FLDZ
    !jmp l_combinations_end
combin_suite:

  !FLD1 ;résultat dans st0
   
  ;si p > n/2
  !SHR eax, 1
  !CMP eax, dword [p.v_p]
  !JG l_combinations_loop

  ;on prend n - p à la place de p
  !MOV eax, dword [p.v_n]
  !SUB eax, dword [p.v_p]
  !MOV dword [p.v_p], eax

  combinations_loop:
  ;tant que p > 0
  !CMP dword [p.v_p], 0
  !JLE l_combinations_end_loop

  ;calcule les combinaisons
  !FIMUL dword [p.v_n]
  !FIDIV dword [p.v_p]
  !DEC   dword [p.v_n]
  !DEC   dword [p.v_p]

  !JMP l_combinations_loop
  combinations_end_loop:

  !FRNDINT
  combinations_end:

  !RET 8
EndProcedure
For n=0 To 10
For p=0 To 10
; For p=0 To n
d.d=combinations(n,p)
 Debug d 
;  Debug f_n(d)+ f_n(n)+f_n(p)
Next 
Next

A+
Encore plus simple

Code : Tout sélectionner

Procedure.d Combinations(n.l,p.l)
    !FINIT
    !FLDZ
  
  ;si n négatif pas de combinaisons
  !TEST dword [p.v_n], $80000000
  !JNE  l_combinations_end

  ;si p négatif pas de combinaisons
  !TEST dword [p.v_p], $80000000
  !JNE  l_combinations_end

  ;si n inférieur à p pas de combinaisons
  !MOV eax, dword [p.v_n]
  !CMP eax, dword [p.v_p]
  !JL  l_combinations_end
  !FLD1 ;résultat dans st0
  ;si p > n/2
  !SHR eax, 1
  !CMP eax, dword [p.v_p]
  !JG l_combinations_loop

  ;on prend n - p à la place de p
  !MOV eax, dword [p.v_n]
  !SUB eax, dword [p.v_p]
  !MOV dword [p.v_p], eax

   combinations_loop:
  ;tant que p > 0
  !CMP dword [p.v_p], 0
  !JLE l_combinations_end_loop

  ;calcule les combinaisons
  !FIMUL dword [p.v_n]
  !FIDIV dword [p.v_p]
  !DEC   dword [p.v_n]
  !DEC   dword [p.v_p]

  !JMP l_combinations_loop
  combinations_end_loop:

  !FRNDINT
  combinations_end:

  !RET 8
EndProcedure
For n=0 To 10
For p=0 To 10
; For p=0 To n
d.d=combinations(n,p)
 Debug d 
;   Debug f_n(d)+ f_n(n)+f_n(p)
Next 
Next


A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
Ganagyre
Messages : 67
Inscription : jeu. 09/nov./2006 13:41
Localisation : PACA

Re: Reglage resultat sortant d'une procedure

Message par Ganagyre »

Bonjour.

PAPIPP, grand merci pour ces 2 amelioration de la Procedure Combinations.

+
Répondre