addsp d#-4,i ;réserver 2 words sur la pile deci d#0,s ;prendre le premier nombre et le placer à la ; case 0 de la pile deci d#2,s ;prendre le deuxième nombre et le placer à la ; case 2 de la pile jsr moyenne addsp d#4,i ;Redonner les 4 octets qu'on a pris à la pile au début ;Cette méthode de nettoyage est simple mais n'est ; pas très propre. Regardez l'exemple suivant pour ; voir la bonne manière de faire... stop moyenne:loada chaine1,i ;charger dans A l'adresse de la chaîne à afficher storea d#-2,s ;la placer sur la pile addsp d#-2,i ;ajuster le pointeur de pile pour l'adresse de ; la chaîne qu'on vient d'y mettre jsr Afficher ;afficher cette chaîne ( "La moyenne de " ) deco d#2,s ;afficher le 1er nombre loada chaine2,i addsp d#-2,i storea d#0,s jsr Afficher ;" et " deco d#4,s ;afficher le 2e nombre charo c#/ /,i charo c#/=/,i charo c#/ /,i ;" = " loada d#2,s adda d#4,s ;A = n1+n2 asra ;A = A/2 (c-à-d, moyenne). Le flag C nous dit si le ; nombre était impair storea d#2,s ;on utilise l'espace du premier nombre pour afficher deco d#2,s ;afficher le résultat brc retenue ;le nombre était impair -> afficher ",5" ;Dans ce cas, on peut faire l'instruction de ; branchement après STOREA et DECO car ces deux ; instructions ne modifient pas les ; flags mis à jour par ASRA br finmoy ;pas de retenue? routine terminée. On pourrait aussi ;faire un RTS directement... retenue:charo c#/,/,i charo c#/5/,i ;",5" finmoy: rts chaine1:.ASCII /La moyenne de / .BYTE d#0 chaine2:.ASCII / et / .BYTE d#0 ; ------- Afficher ; Affiche une chaîne de caractères ASCII jusqu'à ce qu'il ; rencontre un caractère nul. Un paramètre qui est ; l'addresse du message sur la pile. ; vieuxX: .EQUATE d#0 ; sauvegarde X vieuxA: .EQUATE d#2 ; sauvegarde A adRet: .EQUATE d#4 ; adresse de retour addrMsg: .EQUATE d#6 ; addresse du message à afficher ; Afficher: ADDSP d#-4,i ; espace local sauvegarde STOREA vieuxA,s ; sauvegarde A STOREX vieuxX,s ; sauvegarde X LOADB addrMsg,s ; B := addresse du message LOADX d#0,i ; X := 0 LOADA d#0,i ; A := 0 EncorA: LDBYTA ,x ; LOOP BREQ FiniA ; EXIT WHEN Message(X) = 0; CHARO ,x ; afficher Message(X); ADDX d#1,i ; X := X + 1; BR EncorA ; END LOOP; FiniA: LOADA adRet,s ; adresse retour STOREA addrMsg,s ; déplacée sur paramètre LOADA vieuxA,s ; restaure A LOADX vieuxX,s ; restaure X ADDSP d#6,i ; nettoyer pile RTS ; .END