; Exemple #1 d'appel de saisir chaine: ; ------------------------------------ ; Constante: ; ---------- TaillMax: .EQUATE d#29 ; TailleMax : constante entier := 29 ; Programme principal: ; -------------------- ; Début LOADA TaillMax,i; -- Paramètre #1 : Taille maximum = 29 STOREA d#-2,s ; LOADA Chaine,i ; -- Paramètre #2 : Adresse de la chaine STOREA d#-4,s ; ADDSP d#-4,i ; JSR LirChain ; Saisir Chaine(adr. chaine,taille) LOADA d#0,s ; STOREA Taille,d ; -- Récupérer la taille de la chaîne ADDSP d#2,i ; LOADA Chaine,i ; STOREA d#-2,s ; ADDSP d#-2,i ; JSR Afficher ; Afficher Chaine(1..taille) CHARO h#0A,i ; Sauter une ligne DECO Taille,d ; Afficher Taille (entier) STOP ; Fin ; Espace réservé pour les variables ou les chaînes de caractères: ; --------------------------------------------------------------- Chaine: .BLOCK d#30 ; Chaîne de 30 caractères Taille: .WORD d#0 ; Taille de la chaîne de caractère : entier ; Sous-programmes: ; ---------------- ; ------- LirChain ; Saisir une chaîne de caractères ; Antécédent: Se réserver un espace pour la chaîne de caractères. ; Empiler la taille maximum de la chaîne de caractères. ; Empiler l'adresse de la chaîne de caractère à lire. ; Conséquent: Le programme lit une chaîne de caractères et entrepose cette chaîne. ; à l'adresse de la chaîne. La taille de la chaîne est retournée. ; La pile est nettoyée de l'adresse de la chaîne. ; ; Pile: | | 0000 ; |__| SCar: .EQUATE d#0 ; Caractère lu |__| <- SP + 0 SVieuxX: .EQUATE d#2 ; Sauvagarde X |__| <- SP + 2 SVieuxA: .EQUATE d#4 ; Sauvagarde A |__| <- SP + 4 SAdrRet: .EQUATE d#6 ; Adresse de retour |__| <- SP + 6 SAdrCha: .EQUATE d#8 ; Adresse de la chaîne |__| <- SP + 8 STaille: .EQUATE d#10 ; Taille |__| <- SP + 10 ; | | ; ; SaisirChaine(adresse chaine : pointeur "en ENTRÉE" ; Taille : entier "En ENTRÉE/SORTIE") ; Début LirChain: ADDSP d#-6,i ; STOREA SVieuxA,s ; -- Sauvegarder A STOREX SVieuxX,s ; -- Sauvegarder X LOADA d#0,i ; -- A := 0000 LOADX d#0,i ; I := 0 LOADB SAdrCha,s ; -- B := Adr. Chaine ; Boucle Encore2: CHARI SCar,s ; Lire car (caractère) LDBYTA SCar,s ; Sortir quand car = caractère de saut de ligne COMPA h#0A,i ; BREQ Fini2 ; STBYTA ,x ; Chaine(I) := car ADDX d#1,i ; I := I + 1 COMPX STaille,s ; BRNE Encore2 ; Sortir quand I = Taille ; FinBoucle Fini2: STOREX STaille,s ; Taille := I LDBYTA h#00,i ; STBYTA ,x ; -- La fin de la chaîne se termine par 00(16) LOADA SAdrRet,s ; STOREA SAdrCha,s ; -- Entreposer adresse de retour plus bas dans la pile LOADA SVieuxA,s ; -- Restaurer A LOADX SVieuxX,s ; -- Restaurer X ADDSP d#8,i ; -- Nettoyer la pile RTS ; Fin LirChain ; ------- 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 ;