Exercice en arm
thesyd
-
kilian Messages postés 8854 Statut Modérateur -
kilian Messages postés 8854 Statut Modérateur -
Bonjour,
je suis un debutant en programmation en arm et j'essaie de fair une fonction qui ajoute 1 dans toute les case d'un tableau
entrer au clavier (les fonctions de saisie" lire8 "et d'impression "EcrChaine ecrire une chaine de caracteres" et "imprim_tab imprime le tableau" marche bien )
et la le problem, c'est que a limpression du tableau resultat ,ca me donne que des 0 voila le code
.set NMAX, 3 @ nombre d'elements
.data
tab1: .skip NMAX @ tableau de NMAX octets
tab2: .skip NMAX @ tableau de NMAX octets
entier: .byte 0 @ entiers de la sequence
ch_tab1: .asciz "tableau donnee"
ch_tab2: .asciz "tableau resultat"
.text
.global main
@ procedure principale
main:
@ remplir le tableau
mov r5, #0 @ indice dans le tableau
ldr r6, adr_tab1 @ adresse de debut du tableau
mov r7, #NMAX @ nombre d'elements
tq1: cmp r5, r7
beq ftq1
ldr r1, adr_entier @ lire un entier
bl Lire8
ldr r1, adr_entier
ldrb r2, [r1]
strb r2, [r6, r5] @ le ranger dans le tableau
add r5, r5, #1 @ octet suivant
bal tq1
ftq1:
@ affiche la phrase tableau donnee
ldr r1, adr_ch_tab1
bl EcrChaine
@ afficher la sequence donnee
ldr r0, adr_tab1
mov r1, #NMAX
bl imprime_tab
@ appel de la procedure map(tab1, NMAX, tab2)
bl map
@ affiche la phrase tableau resultat
ldr r1, adr_ch_tab2
bl EcrChaine
@ afficher la sequence resultat
ldr r0, adr_tab2
mov r1, #NMAX
bl imprime_tab
@ fin du programme principal
bal exit
@ adresses pour l'acces en zone data
adr_tab1:
.word tab1
adr_tab2:
.word tab2
adr_entier:
.word entier
adr_ch_tab1:
.word ch_tab1
adr_ch_tab2:
.word ch_tab2
@ les fonctions
@ procedure map
@ parametres :
@ algorithme :
map:
mov r9,lr @ sauvgarde de lr
ldr r1,adr_tab1
ldr r2,adr_tab2
mov r5,#0
tq2: cmp r5, r7
beq ftq2
ldrb r3,[r1,r5]
bl plus_un @ appel de la fonction plus un
strb r4, [r2,r5] @ le ranger dans le tableau 2
add r5, r5, #1 @ octet suivant
bal tq2
ftq2: mov pc, lr
plus_un :
add r4, r3, #1
mov pc,r9 @ pc<-lr
merci de votre reponse rapide^^
je suis un debutant en programmation en arm et j'essaie de fair une fonction qui ajoute 1 dans toute les case d'un tableau
entrer au clavier (les fonctions de saisie" lire8 "et d'impression "EcrChaine ecrire une chaine de caracteres" et "imprim_tab imprime le tableau" marche bien )
et la le problem, c'est que a limpression du tableau resultat ,ca me donne que des 0 voila le code
.set NMAX, 3 @ nombre d'elements
.data
tab1: .skip NMAX @ tableau de NMAX octets
tab2: .skip NMAX @ tableau de NMAX octets
entier: .byte 0 @ entiers de la sequence
ch_tab1: .asciz "tableau donnee"
ch_tab2: .asciz "tableau resultat"
.text
.global main
@ procedure principale
main:
@ remplir le tableau
mov r5, #0 @ indice dans le tableau
ldr r6, adr_tab1 @ adresse de debut du tableau
mov r7, #NMAX @ nombre d'elements
tq1: cmp r5, r7
beq ftq1
ldr r1, adr_entier @ lire un entier
bl Lire8
ldr r1, adr_entier
ldrb r2, [r1]
strb r2, [r6, r5] @ le ranger dans le tableau
add r5, r5, #1 @ octet suivant
bal tq1
ftq1:
@ affiche la phrase tableau donnee
ldr r1, adr_ch_tab1
bl EcrChaine
@ afficher la sequence donnee
ldr r0, adr_tab1
mov r1, #NMAX
bl imprime_tab
@ appel de la procedure map(tab1, NMAX, tab2)
bl map
@ affiche la phrase tableau resultat
ldr r1, adr_ch_tab2
bl EcrChaine
@ afficher la sequence resultat
ldr r0, adr_tab2
mov r1, #NMAX
bl imprime_tab
@ fin du programme principal
bal exit
@ adresses pour l'acces en zone data
adr_tab1:
.word tab1
adr_tab2:
.word tab2
adr_entier:
.word entier
adr_ch_tab1:
.word ch_tab1
adr_ch_tab2:
.word ch_tab2
@ les fonctions
@ procedure map
@ parametres :
@ algorithme :
map:
mov r9,lr @ sauvgarde de lr
ldr r1,adr_tab1
ldr r2,adr_tab2
mov r5,#0
tq2: cmp r5, r7
beq ftq2
ldrb r3,[r1,r5]
bl plus_un @ appel de la fonction plus un
strb r4, [r2,r5] @ le ranger dans le tableau 2
add r5, r5, #1 @ octet suivant
bal tq2
ftq2: mov pc, lr
plus_un :
add r4, r3, #1
mov pc,r9 @ pc<-lr
merci de votre reponse rapide^^
A voir également:
- Exercice en arm
- Adobe arm ✓ - Forum Virus
- Transmath 3eme exercice ✓ - Forum Études / Formation High-Tech
- Corrigé d'un exercice du livre transmaths 3e - Forum Loisirs / Divertissements
- Corrigés 350 exercices niveau moyen ✓ - Forum Loisirs / Divertissements
- Cahier transmath 3° ex 6p37, 6et7p27 et 5p65 svp c'est urgent! ✓ - Forum Études / Formation High-Tech
2 réponses
Ah oui le problème est dans ta fonction map.
Au début tu sauvegardes lr dans r9.
Tu charges tes deux tableaux dans r1 et r2, tu mets l'entier de l'occurence courante dans r3 puis hop tu sautes dans plus_un.
Seulement dans plus_un tu fais peut être une addition mais après tu charges r9 dans pc. Or ce qu'il y a dans r9 c'est l'ancienne valeur de lr, c'est à dire l'adresse de retour ou doit sauter le code à la fin de map.
C'est le lr de map et non pas de plus_un.
Donc du coup tu ne passes qu'une fois dans plus_un et tu reviens directement dans ton main.
Dans ton plus_un tu devrais faire:
Parce que au moment où tu fais "bl plus_un" tu écrases lr pour y mettre la valeur de retour après cette instruction. Donc c'est bien lr que tu dois utiliser dans plus_un et non pas r9 qui contient le retour de map et non pas de plus_un.
Tu me suis?
D'ailleurs je comprends pas pourquoi tu crées carrément une fonction pour faire une simple addition.
map pourrait être résumée comme ceci:
Au début tu sauvegardes lr dans r9.
Tu charges tes deux tableaux dans r1 et r2, tu mets l'entier de l'occurence courante dans r3 puis hop tu sautes dans plus_un.
Seulement dans plus_un tu fais peut être une addition mais après tu charges r9 dans pc. Or ce qu'il y a dans r9 c'est l'ancienne valeur de lr, c'est à dire l'adresse de retour ou doit sauter le code à la fin de map.
C'est le lr de map et non pas de plus_un.
Donc du coup tu ne passes qu'une fois dans plus_un et tu reviens directement dans ton main.
Dans ton plus_un tu devrais faire:
plus_un :
add r4, r3, #1
mov pc, lr
Parce que au moment où tu fais "bl plus_un" tu écrases lr pour y mettre la valeur de retour après cette instruction. Donc c'est bien lr que tu dois utiliser dans plus_un et non pas r9 qui contient le retour de map et non pas de plus_un.
Tu me suis?
D'ailleurs je comprends pas pourquoi tu crées carrément une fonction pour faire une simple addition.
map pourrait être résumée comme ceci:
map:
@ pas besoin de sauvegarder lr puisque tu n'appelles pas d'autre fonction
ldr r1,adr_tab1
ldr r2,adr_tab2
mov r5,#0
tq2:
cmp r5, r7
beq ftq2
ldrb r3, [r1, r5] @chargement de l'entier de tab1
add r3, r3, #1 @addition de l'entier
strb r3, [r2, r5] @stockage de l'entier dans tab2
add r5, r5, #1 @ octet suivant
b tq2 @ on saute à tq2 pour continuer la boucle
mov pc, lr @ On revient dans le main
merci kilian au fait j'ai trouver l'erreur en relisant mon post je te remerci et pour te repondre pour quoi j'ai cree une fonction pour fair cette addition
j'essai de manipuler les appel de fonctions
il faut juste sauvgarder l'adresse de retoure l'appelant "map" dans un regitre r9 (mov r9,lr)puis a la fin faire mov pc,r9
car on perd l'adresse de retoure ecraser par la fonction appeler "plus_un" (derniere ligne mov pc,lr)
si t'a du temps libre je poserais plein de questions car je suis entrain de essayer d'apprendre le passage de parametre
par la pile
merci beaucoup pour ton interet^^
j'essai de manipuler les appel de fonctions
il faut juste sauvgarder l'adresse de retoure l'appelant "map" dans un regitre r9 (mov r9,lr)puis a la fin faire mov pc,r9
car on perd l'adresse de retoure ecraser par la fonction appeler "plus_un" (derniere ligne mov pc,lr)
si t'a du temps libre je poserais plein de questions car je suis entrain de essayer d'apprendre le passage de parametre
par la pile
merci beaucoup pour ton interet^^