loada lgcote1,d storea d#-4,s ;stocker le coté 1 à la case COTE1 loada lgcote2,d storea d#-6,s ;stocker le coté 2 à la case COTE2 addsp d#-6,i ;mettre à jour le pointeur de pile ; (3 variables -> 6 octets) jsr PerimRec loada d#0,s ;A = Périmètre storea lgperim,d addsp d#2,i ;nettoyer la pile deco lgperim,d stop lgcote1: .WORD d#15 lgcote2: .WORD d#20 lgperim: .WORD d#0 ;FONCTION DE CALCUL DU PERIMETRE D'UN RECTANGLE REGX: .EQUATE d#0 ;Registre X original REGA: .EQUATE d#2 ;Registre A original TEMP: .EQUATE d#4 ;Variable temporaire RET: .EQUATE d#6 ;Adresse de retour COTE2: .EQUATE d#8 ;Longueur du 2e coté (Entrée) COTE1: .EQUATE d#10 ;Longueur du 1er coté (Entrée) PERIM: .EQUATE d#12 ;Périmètre du rectangle (Sortie) ;Début de la fonction: PerimRec: addsp d#-6,i ;réserver 6 octets pour les ; variables locales (REGX, REGA et TEMP) storea REGA,s ;sauver l'état du registre A storex REGX,s ;sauver l'état du registre X loada COTE1,s asla ;cote1 * 2 storea TEMP,s loada COTE2,s asla ;cote2 * 2 adda TEMP,s ;cote2 + cote1 storea PERIM,s ;stocker la réponse dans la variable ; qui sera retournée ;Fin de la fonction: loada RET,s ;récupérer l'adresse de retour storea COTE1,s ;et la stocker juste au dessus de PERIM loada REGA,s ;récupérer les registres A et X originaux loadx REGX,s addsp d#10,i ;et nettoyer la pile (on veut que SP ; pointe le nouvel emplacement ; de RET (à COTE1, donc +10) rts .END