Created
March 25, 2014 19:09
-
-
Save PhiBabin/9768990 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;Philippe Turgeon | |
;Émile Lévesque | |
NAME main | |
PUBLIC __iar_program_start | |
SECTION .intvec : CODE (2) | |
CODE32 | |
__iar_program_start | |
B main | |
MaChaine DC8 "(2345",0x00 | |
Mapile DS32 64 | |
SECTION .text : CODE (2) | |
CODE32 | |
main | |
LDR SP, =Mapile | |
ADD SP, SP, #256 | |
LDR R0, =MaChaine ;Adresse de MaChaine dans registre R0 | |
PUSH {R0} ;Passage de paramètre par la pile | |
BL VerifieParentheses ;Appel de la fonction | |
POP {R0} ;Récupération du résultat | |
B main | |
VerifieParentheses | |
PUSH {R3-R5} ;sauvegarde les registres sur la pile | |
PUSH {R0-R1} | |
LDR R0, [SP, #20] ; POP {R0} ;Récupération du paramètre dentrée par la pile | |
PUSH {R0} | |
MOV R2, #0 ;Initialise R2 à 0 | |
Boucle | |
LDRB R1, [R0, R2] ;Mettre le caractère courant correspondant au début de la chaine plus un compteur, en R1 | |
CMP R1, #0x28 ;Compare avec une parenthèse ouverte 0x28 0x29 | |
PUSHEQ {R1} | |
CMP R1, #0x5B ;Compare avec une parenthèse carée d'ouverture 0x5B 0x5D | |
PUSHEQ {R1} | |
CMP R1, #0x7B ;Compare avec une accolade ouverte 0x7B 0x7D | |
PUSHEQ {R1} | |
CMP R1, #0x29 ;Compare avec une parenthèse fermeture | |
BEQ parenthese | |
CMP R1, #0x5D ;Compare avec une parenthése caree fermeture | |
BEQ caree | |
CMP R1, #0x7D ;Compare avec une accolade de fermeture | |
BEQ accolade | |
FinTestComparaison | |
ADD R2, R2, #1; incrémente le compteur | |
CMP R1, #0 | |
BNE Boucle ; Boucle si le prochain caractère à traiter n'est pas vide | |
POP {R4} ;prend un paramètre de la pile | |
CMP R0, R4 | |
MOVEQ R2, #0 | |
POP {R1} | |
POP {R3-R5} ;récupère les registres sauvegardés sur la pile | |
PUSH {R2} ;retourne 0 si correct via la pile | |
BX LR ;Retour de fonction | |
parenthese ;Vérifie si la valeur en pile correspond à une ouverture de parentèse | |
POP {R5} ;prend la valeur sur la pile | |
CMP R5, #0x28 ;Compare avec une parenthèse ouverte 0x28 | |
BEQ FinTestComparaison | |
ADD R2, R2, #1; retourne la position du caractère en erreur (premier = 1) | |
POP {R0-R1} | |
POP {R3-R5} ;récupère les registres sauvegardés sur la pile | |
PUSH {R2} | |
BX LR ; retourne la position du caractère en erreur (premier = 1) | |
caree ; Vérifie si la valeur en pile correspond à une ouverture de parentèse carrée | |
POP {R5} ;prend la valeur sur la pile | |
CMP R5, #0x5B ;Compare avec une parenthèse carée d'ouverture 0x5B | |
BEQ FinTestComparaison | |
ADD R2, R2, #1; retourne la position du caractère en erreur (premier = 1) | |
POP {R0-R1} | |
POP {R3-R5} ;récupère les registres sauvegardés sur la pile | |
PUSH {R2} | |
BX LR ; retourne la position du caractère en erreur (premier = 1) | |
accolade ; Vérifie si la valeur en pile correspond à une ouverture d'accolade | |
POP {R5} ;prend la valeur sur la pile | |
CMP R5, #0x7B ;Compare avec une accolade ouverte 0x7B | |
BEQ FinTestComparaison | |
ADD R2, R2, #1 ; retourne la position du caractère en erreur (premier = 1) | |
POP {R0-R1} | |
POP {R3-R5} ;récupère les registres sauvegardés sur la pile | |
PUSH {R2} | |
BX LR ; retourne la position du caractère en erreur (premier = 1) | |
SECTION `.noinit`:DATA(2) | |
;MaChaine DC8 "Une (chaine) [ de caractères {correcte}]" | |
END | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment