0% ont trouvé ce document utile (0 vote)
146 vues4 pages

Structure du Code Assembleur DSP C6713

Ce document décrit la structure du code assembleur pour le processeur TMS320C6x. Il présente le format général d'une ligne de code assembleur et explique les différents éléments qui la composent comme les étiquettes, conditions, instructions, opérandes et commentaires. Un exemple de code assembleur pour le calcul d'un produit scalaire est également fourni et commenté.

Transféré par

Salima SEGHIER
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
146 vues4 pages

Structure du Code Assembleur DSP C6713

Ce document décrit la structure du code assembleur pour le processeur TMS320C6x. Il présente le format général d'une ligne de code assembleur et explique les différents éléments qui la composent comme les étiquettes, conditions, instructions, opérandes et commentaires. Un exemple de code assembleur pour le calcul d'un produit scalaire est également fourni et commenté.

Transféré par

Salima SEGHIER
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Chapitre II : Architecture des DSP TMS320C6x

II.6 Structure du code assembleur


Un programme en langage assembleur doit être un fichier texte ASCII.
Toute ligne de code assembleur peut inclure jusqu'à sept éléments selon le format :

Label: || [condition] instruction unit operands ; comment

Label: Étiquette, jusqu’à 32 caractères alphanumériques, le premier caractère est


positionné sur la première colonne du fichier texte, généralement c’est le caractère
underscore _
|| Barres parallèles, exécution en parallèle

[condition] Si une condition est spécifiée l'instruction s'exécute dans le cas où cette
condition est vraie. Si elle n'est pas spécifiée, l'instruction est toujours exécutée.
Instruction c’est soit une directive, soit des mnémoniques:
Les directives d’assemblage sont des commandes asm6x qui contrôlent le processus
d'assemblage ou définissent les structures de données (constantes et variables). Les
directives d'assemblage commencent par un point. Les mnémoniques du processeur
sont les instructions qui s'exécutent dans le programme. Les mnémoniques doivent
commencer à la colonne 2 ou plus.
unit Unité fonctionnelle. La spécification de l'unité fonctionnelle dans le code
assembleur est optionnelle, pour documenter le code sur la ressource utilisée par
l’instruction

operands Les instructions C6713 utilisent trois types d'opérandes pour accéder aux
données : les registre, les constants, et les pointeurs d’adresses de données.
Seules les instructions de chargement et de stockage de données en mémoire utilisent
des opérandes pointeur.
Toutes les instructions C6713 ont un opérande destination. La plupart des instructions
nécessitent un ou deux opérandes source, qui doivent être dans le même chemin de
données.
Un opérande source par paquet d’instructions parallèles peut provenir du chemin
opposé, dans ce cas on ajoute X au nom de l’unité pour chemin croisé.
;comment commentaires qui aident la lisibilité du programme, sans effet sur son
exécution

1
Exemple de code assembleur Produit scalaire 𝑦 = ∑10 𝑛=1 𝑐𝑛𝑥𝑛
vecteurs c et x à 10 composantes de type entiers signés

Il convient de mentionner que l'assembleur n'est pas case-sensitive, c'est-à-dire, les


instructions et les registres peuvent être écrits indifféremment en minuscules ou en
majuscules.
Dans cet exemple, seules les unités fonctionnelles A sont utilisées, et 8 parmi les 16
les registres sont affectés :

Un compteur de boucle est configuré en utilisant l'instruction de déplacement de


constante MVK.
Cette instruction utilise l'unité .S1 pour placer la constante 10 décimal dans le registre
A2.
Le début de la boucle est indiqué par l'étiquette loop
La fin de boucle est indiquée une instruction de soustraction SUB qui décrémente le
compteur de boucle A2 suivi d'une instruction de branchement B ver le début de la
boucle si A2 n’est pas nul.
2
Les crochets [ ] dans l'instruction de branchement indiquent qu'il s'agit d'une
instruction conditionnelle.
Les instructions du C6713 peuvent être conditionnées en fonction d'une valeur nulle
ou non nulle dans l'un des registres : A1, A2, B0, B1 et B2.
La syntaxe [A2] signifie ”exécuter l'instruction si A2≠0”, [! A2] signifie ”exécuter
l'instruction si A2=0”.

MVK et MVKH sont utilisés pour charger l'adresse de cn, de xn, et de y,


respectivement dans les registres A5, A6 et A7. Ces instructions doivent être exécutées
dans l'ordre indiqué pour charger d’abord les 16 bits inférieurs de l'adresse 32 bits
complète, suivis des 16 bits supérieurs. C'est-à-dire l’instruction MVK écrase le 16-
MSB du registre cible.
Les registres A5, A6, A7, sont utilisés comme pointeurs pour charger cn, xn dans les
registres A0, A1 et stocker y à partir du registre A4 après la fin de la boucle.
Selon le type de données, on peut utiliser l'une des instructions de chargement
suivantes: LDB octets (8 bits), LDH demi-mots (half-word 16 bits), ou LDW mots
(word 32 bits). Dans notre exemple, les données sont supposées être de 16 bit.
Notez que les pointeurs A5 et A6 doivent être post-incrémentés, de sorte qu'ils
pointent l’adresse suivante à la prochaine itération de la boucle.
Les instructions MPY et ADD dans la boucle exécutent l'opération de produit scalaire.
L'instruction MPY est effectuée par l'unité .M1 et ADD par l'unité .L1.
Enfin, il convient de mentionner que le code ci-dessus tel quel ne fonctionnera pas
correctement sur le C6713 à cause du pipeline des instructions Sur le processeur
C6713, la lecture d’une instruction se fait en quatre phases, chacune nécessitant un
cycle. Celles-ci incluent générer l'adresse de l'instruction, envoyer l'adresse à la
mémoire, attendre l’opcode, et lire l'opcode de la mémoire.
Le décodage de l’instruction se fait en deux phases, chacune nécessitant un cycle
d'horloge. Ce sont l'envoi aux unités fonctionnelles appropriées (dispatch), et le
décodage par l’unité.
L'exécution varie de une à six phases selon les instructions. Ce qui peut donner lieu à
un maximum de 5 retards. En raison des retards associés aux instructions de
multiplication (MPY 1 retard), de chargement (LDH 4 retards) et de branchement (B 5
retards), un nombre approprié de NOP (no operation ou délai) doit être inséré lorsque
le résultat d'une instruction est utilisé par l'instruction suivante dans un programme
afin que le pipeline fonctionne correctement.
Par conséquent, pour que l'exemple précédent s'exécute sur le processeur C6713, un
NOP après la multiplication MPY, 4 NOP après le chargement LDH, 5 NOP après le
branchement B, doivent être insérés.

3
4

Vous aimerez peut-être aussi