Skip to content

Instantly share code, notes, and snippets.

@PhiBabin
Created March 25, 2014 19:09
Show Gist options
  • Save PhiBabin/9768990 to your computer and use it in GitHub Desktop.
Save PhiBabin/9768990 to your computer and use it in GitHub Desktop.
;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