Page Personnelle de Vincent Kerhoas
Vincent Kerhoas
Enseignant du Supérieur
Professeur Agrégé
Page Personnelle de Vincent Kerhoas

Le processeur ARM Cortex - Partie 2

Back                  << Index >>

Appel d’une fonction ( Suite )

Problème des Fonction Imbriquées

Dans le makefile, effectuer la modification suivante :

ASRC += src/main_calc_3.s ### A MODIFIER ###

Considérons la fonction average qui fait appel à notre fonction sum_tab précédente :

main_calc_3.s

Etant donné que mon 2ème bl a pour effet d’écraser le registre LR contenant le retour à la fonction main, je reste coincé dans la fonction average.

Utilisation de la pile

Dans le makefile, effectuer la modification suivante :

ASRC += src/main_calc_4.s ### A MODIFIER ###

Afin de sauvegarder le registre LR en cas d’appels de fonctions imbriqués, nous utilisons un espace en mémoire appelé la pile. Pour se repérer dans cette zone mémoire, nous utilisons le registre pointeur de pile SP (stack pointer).
En plus du registre LR, il est possible de sauvegarder des registres généraux afin de conserver le contexte de la fonction appelante.

main_calc_4.s


Mix C/assembleur

Dans le makefile, effectuer la modification suivante :
SRC += src/main_5.c
ASRC += src/calc_5.s ### A MODIFIER ###

Par la suite nous utiliserons uniquement le langage C.
Le compilateur effectue donc dans un premier temps une conversion du langage C vers l’assembleur.
Lors d’un appel de fonction, le compilateur respecte les règles du standart AAPCS ( R0,R1,R2,R3 pour passer les paramètres, R0 pour la valeur de retour ).

main_5.c
calc_5.s

Disassembly :

L’interprétation assembleur du code en C se trouve dans la fenêtre disassembly :

disassembly

TRAVAUX PRATIQUES

PROJET SOURCE


WORKSPACE_LAB_F411_ASM_STM32CUBE


Conversion valeur en décimal –> Chaine de caractères

Dans le makefile, effectuer la modification suivante :

SRC += src/main.c
# ASRC += src/main_remove_space.s
ASRC += src/int2ascii.s

On considère le programme c suivant permettant de convertir un entier en ASCII :

main.c

On se propose de coder en assembleur le sous programme int2ascii dont la spécification est donnée ci-dessous :

fonction int2ascii : convertit une valeur entière non signée en une chaîne de caractère.
Paramètre 1 : r0 contient la valeur à convertir
Paramètre 2 : r1 contient l’adresse de la chaîne de caractère

On donne l’organigramme de int2ascii :

Q1. Proposer un codage de la fonction int2ascii en assembleur, dans un contexte où la fonction main est en C.


Back                  << Index >>