Sie sind auf Seite 1von 12

1

8 Programmation
Aprs un bref rappel du jeu dinstructions du processeur LC-2, on tudie la programmation en langage machine et en assembleur, ldition de liens pour produire un programme excutable, et la pile dexcution.

8.1 Jeu dinstructions


La gure 1 prsente un tableau rcapitulatif du format des instructions du LC-2. Quelques remarques importantes. Les instructions ADD, AND, NOT, LD, LDI, LDR et LEA modient les codes de condition , et . Les instructions JMP et JSR (resp. JMPR et JSRR) ont les mmes opcodes (bits 12 15) et ne diffrent que par le bit 11, appel pour link (i.e., sauvegarder ladresse de retour) Les instructions RTI et TRAP seront tudis dans un chapitre ultrieur : elles sont ncessaires pour la programmation dappels systme et dinterruptions. Nous utiliserons nanmoins linstruction TRAP x25, en supposant que celle-ci appelle une routine du systme dexploitation qui arrte lexcution du processeur. Les instructions LDI et STI ne respectent pas la philosophie RISC o les seuls accs mmoire sont des oprations load /store lmentaires ; elles ne sont donc pas indispensables : LDI peut tre remplace par LD et LDR, STI par LD et STR. Dans toute la suite, on supposera que les programmes en langage machine excuts par le LC-2 commencent ladresse x3000.

2
15 ADD DR, SR1, SR2 ADD DR, SR1, imm5 AND DR, SR1, SR2 AND DR, SR1, imm5 NOT DR, SR BRnzp label JMP label JSR label JMPR label JSRR label LEA DR, label LD DR, label LDI DR, label LDR DR, BaseR, label ST SR, label STI SR, label STR SR, BaseR, label RET RTI TRAP trapvect8 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 1 0 1 1 1 14 0 0 1 1 0 0 1 1 1 1 1 0 0 1 0 0 1 1 0 1 13 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 12 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 n 0 1 0 1 11 10 DR DR DR DR DR z 0 0 0 0 DR DR DR DR SR SR SR 0 0 0 0 0 0 0 0 0 p 0 0 0 0 9 8 7 SR1 SR1 SR1 SR1 SR 6 5 0 1 0 1 1 4 0 3 0 2 1 SR2 0

imm5 : immdiat 5-bits sign

SR2

imm5 : immdiat 5-bits sign

offset 9-bits non sign dans la page courante

offset 9-bits non sign dans la page courante

offset 9-bits non sign dans la page courante

BaseR BaseR

index 6-bits non sign

index 6-bits non sign

offset 9-bits non sign dans la page courante

offset 9-bits non sign dans la page courante

offset 9-bits non sign dans la page courante

BaseR

index 6-bits non sign

offset 9-bits non sign dans la page courante

offset 9-bits non sign dans la page courante

BaseR 0 0 0 0 0 0

index 6-bits non sign

0 0

0 0

0 0

0 0

0 0

trapvect8 : vecteur dinterruption 8-bits

F IG . 1 Format des instructions du LC-2

8.2 Programmation en assembleur


On considre la boucle de la gure 2 qui ajoute 5 aux 100 premiers lments dun tableau A.
int i, A[100] ; for (i=0 ; i<100 ; i++) { A[i] = A[i] + 5 ; }

F IG . 2 Exemple de programme C traduire en langage machine LC-2 Le langage assembleur ou langage dassemblage se situe un niveau dabstraction au dessus du langage machine. Il propose des instructions lmentaires directement calques sur les instructions du processeur. Lassembeur dsigne loutil de traduction du langage dassemblage vers le langage machine ; il automatise le codage en binaire des instructions lmentaires. En particulier, la programmation en assembleur pargne le calcul des adresses de branchement et des offsets daccs la mmoire. Par exemple, lors de la traduction en binaire dune instruction de branchement conditionnel pour le LC-2, lassembleur vrie que ladresse de destination se situe bien dans la page courante du PC.
Ligne 1 2 3 4 5 6 Loop 7 8 9 10 11 12 Instruction AND ADD ADD ADD ADD LDR ADD STR ADD ADD BRn TRAP R0, R0, R2, R0, R2, R2, R2, R2, R2, R2, R1, R0, R1, R1, R1, R0, R0, R0, R3, R0, Loop x25 #0 #-12 #-13 R2 R2 #30 #5 #30 #1 R2 Commentaire ; i 0

; ; ; ; ;

R2 -100 R1 Mem[30+i] R1 R1+5 Mem[30+i] R1 i i+1


; si (i<100) aller Loop ; arrter la machine

F IG . 3 Premire version en assembleur LC-2 La gure 3 montre un premier exemple de programme en assembleur LC-2. La syntaxe gnrale des instructions est donne dans le tableau suivant. N de ligne Label

Opcode Oprandes

Commentaire

Le numro de ligne ne doit pas tre confondu avec ladresse en mmoire de linstruction (sur 16 bits), dtermine ultrieurement lors de la traduction en langage machine. Les labels permettent de nommer des adresses de manire symbolique, ils ressemblent des pointeurs (constants) en langage C. Ils dsignent soit une zone mmoire pour des chargements ou rangements (LDR R1, Cst), soit une cible pour une instruction de branchement (BRn Loop).

4 Les opprations sont les noms associs aux opcodes des instructions du langage machine. Les oprandes peuvent tre : un registre R ( ); une valeur immdiate ou un offset pour chargement/rangement ou pour un branchement ; un label (i.e., un offset symbolique ) pour un chargement/rangement ou pour un branchement. La traduction du programme prcdent en langage machine est donne sur les gures 4 et 5.

Adresse x3000 x3001 x3002 x3003 x3004 x3005 x3006 x3007 x3008 x3009 x300A x300B

Instruction AND ADD ADD ADD ADD LDR ADD STR ADD ADD BRn TRAP

R0, R0, R2, R0, R2, R2, R2, R2, R2, R2, R1, R0, R1, R1, R1, R0, R0, R0, R3, R0, x3005 x25

#0 #-12 #-13 R2 R2 #30 #5 #30 #1 R2

Code machine ; 0101 000 000 1 00000 ; 0001 010 000 1 10100 ; 0001 010 010 1 10011 ; 0001 010 010 0 00 010 ; 0001 010 010 0 00 010 ; 0110 001 000 011110 ; 0001 001 001 1 00101 ; 0111 001 000 011110 ; 0001 000 000 1 00001 ; 0001 011 000 0 00 010 ; 0000 100 000000101 ; 1111 0000 00100101

F IG . 4 Traduction de la premire version

Adresse Binaire (16 bits) x3000 x3001 x3002 x3003 x3004 x3005 x3006 x3007 x3008 x3009 x300A x300B 0101000000100000 0001010000110100 0001010010110011 0001010010000010 0001010010000010 0110001000011110 0001001001100101 0111001000011110 0001000000100001 0001011000000010 0000100000000101 1111000000100101

Hexadcimal x5020 x14B4 x1483 x1482 x1482 x621E x1265 x721E x1021 x1602 x0805 xF025

F IG . 5 Implmentation en langage machine

5 En plus des instructions correspondant aux oprations implmentes sur le LC-2, le programme assembleur peut contenir des pseudo-instructions : il sagit de raccourcis pour des appels systme associs des vecteurs dinterruption. Par exemple, lappel systme TRAP x25 correspondant larrt de la machine peut plus simplement scrire HALT en assembleur. Directive .ORIG adresse Signication Adresse en mmoire de la premire instruction du programme Exemple .ORIG x3000 indique que AND R0, R0, #0 est ladresse x3000

.FILL valeur

Rserver le mot mmoire suivant et y stocker le paramtre valeur

.FILL -100 rserve un mot juste aprs linstruction HALT (ladresse du label Cst) et y stocke la valeur -100 en complment 2 sur 16 bits

.STRINGZ chane Stocker la chane de caractres, avec un caractre ASCII par mot 16-bits, suivi du mot nul de n de chane

.STRINGZ "Salut" initialise les 6 premiers mots du tableau A avec x0053 x0061 x006c x0075 x0074 x0000

.BLKW nombre

Les nombre mots mmoire suivants sont rservs comme mmoire de travail

.BLKW 100 rserve 100 mots conscutifs pour complter le tableau A

.END

Fin du code source du programme

F IG . 6 Directives de lassembleur LC-2 Enn, le programme assembleur contient toujours des directives de deux types : dune part des donnes numriques (constantes ou valeurs dinitialisation de variables), et dautre part des direc-

6 tives de placement du programme en langage machine dans la mmoire du LC-2. Ces directives sont dcrites sur le tableau de la gure 6 et illustres sur la gure 7 par une nouvelle implmentation en assembleur de la boucle de la gure 2.
.ORIG x3000 ; adresse de dbut du programme ; boucle qui ajoute 5 aux 100 lments dun tableau A AND R0, R0, #0 ; i 0 LD R2, Cst ; R2 -100 LDR R1, R0, A ; R1 A[i] ADD R1, R1, #5 ; R1 R1+5 STR R1, R0, A ; A[i] R1 ADD R0, R0, #1 ; i i+1 ADD R3, R0, R2 BRn Loop ; si (i<100) aller Loop HALT ; TRAP x25 pour arrter la machine ; zone de stockage .FILL -100 ; constante -100 .STRINGZ "Salut" ; Les 6 premiers mots du tableau A .BLKW 100 ; rservation de 100 mots .END ; n du programme assembleur

Loop

Cst A

F IG . 7 Deuxime version en assembleur LC-2

8.3 Processus dassemblage


Le processus dassemblage (i.e., traduction en langage machine) comporte deux passes. En effet, il est ncessaire de calculer au pralable les adresses des labels et des instructions, en interprtant les directives. On construit ainsi une table des symboles, associant chaque label une adresse en mmoire. Dans une deuxime passe, les instructions assembleur sont traduites en binaire, les offsets et les adresses correspondant aux labels tant calculs partir de la table des symboles. La table des symboles du programme assembleur de la gure 7 est dtaille dans le tableau suivant. Symbole Adresse Loop x3002 Cst x3009 A x300A Le code binaire issu de lassemblage sappelle le code objet. titre dexercice, on pourra effectuer lassemblage du programme de la gure 7 et vrier le rsultat avec celui de lassembleur lc2asm fourni en TD. Ce schma de traduction en deux passes est compliqu par deux particularits des programmes rels : une application complexe fait appel des fonctions de bibliothques ou du systme dexploitationm, et elle est souvent scinde en plusieurs chiers, suivant un dcoupage logique inconnu

7 de lassembleur. Il en rsulte que certains symboles du programme assembleur ne correspondent pas du code ou des donnes prsents lors de lassemblage. Ces symboles sont indiqus par une directive .EXTERN symbole pour indiquer que ladresse de symbole sera dtermine ultirieurement. Le code objet rsultant de lassemblage contient donc une table des symboles. Certains de ces symboles nont pas dadresse connue, on dit que ces symboles ne sont pas rsolus lors de lassemblage. Pour pouvoir excuter le programme, plusieurs chiers objet (et des bibliothques) doivent tre rassembls lors de la phase ddition de liens. Cette phase consiste faire correspondre les diffrentes tables des symboles des codes objet, et rsoudre chaque symbole externe, i.e., leur affecter leur adresse en mmoire.

8.4 Structures de donnes


La traduction des structures de donnes dun langage impratif comme le C en assembleur LC-2 ne pose pas de problmes particuliers. Un entier sur 16 bits et stock sur un mot, un nombre ottant 32 bits sur 2 mots conscutifs, et un tableau dentiers sur mots conscutifs. On a vu que les chanes de caractres subissaient un tratement particulier (proche du codage UNICODE en Java) : chaque caractre ASCII est cod sur un octet, mais un seul caractre ASCII est stock dans chaque mot 16 bits (sur loctet de poids faible), le caractre de n de chane tant le mot x0000. En assembleur, laccs aux lments dun tableau peut tre implment de deux manires duales, dpendantes de ladresse de celui-ci et du type de parcours envisag.

1. La technique la plus simple est utilise dans le programme de la gure 7. Elle sapplique lorsque ladresse de base du tableau (ladresse du premier lment) se situe dans la page du PC courant. Il suft alors dune instruction de chargement/rangement avec mode dadressage index par un registre contenant le numro de llment du tableau accd : par exemple, LDR R1, R0, A, LDR R1, R0, x300A, SDR R1, R0, A, ou SDR R1, R0, x300A. 2. Une technique beaucoup plus gnrale consiste charger ladresse de base du tableau dans un registre, et ajouter un offset ce registre de rfrence en fonction de llment accd : par exemple,
LEA LDR ADD LDR R0, R2, R1, R2, A R0, #10 R0, #1 R1, #10 ; R0 ; R2

adresse de base de A A[10]

; R2

A[11]

Cette technique est gnralement employe par les compilateurs, ou lorsque la zone mmoire accde nest pas proximit immdiate du programme.

8.5 Structures de contrle


8.5.1 Conditionnelles Les tests de la forme if ( ) { } sont implments laide dun unique branchement conditionnel. Par exemple,
if (x > 5) x = x + 1;

scrit simplement
; en supposant que x est associ R0 ADD R1, R0, #-5 ; x-5 BRnz EndIf ; x-5 ADD R0, R0, #1 ; suite du programme

EndIf

Les tests de la forme if ( ) { } else { } sont implments laide dun branchement conditionnel et dun branchement inconditionnel. Par exemple,
if (x == 5) x = x + 1; else x = x - 1;

Peut scrire
; en supposant que x est associ ADD R1, R0, #-5 BRnp Else ADD R0, R0, #1 BRnzp EndIf ADD R0, R0, #-1 ; suite du programme R0 ; x-5 ; x-5

; saute la branche else

Else EndIf

8.5.2 Boucles Les boucles while ( ) { } et for ( ; ; ) { } se traduisent priori par deux branchements. En effet, le test doit avoir lieu avant lexcution du corps de boucle. Par exemple,
while (x < 5) x = x + 1;

Peut scrire
; en supposant que x est associ ADD R1, R0, #-5 BRzp EndWhile ADD R0, R0, #1 BRnzp While EndWhile ; suite du programme While R0 ; x-5 ; x-5 ; it

9 En revanche, les boucles do { } while ( ) sexcutent au moins une fois et peuvent tre crites laide dun unique branchement.
do x = x + 1; while (x < 5)

Peut scrire
Do ; en supposant que x est associ R0 ADD R0, R0, #1 ADD R1, R0, #-5 ; x-5 BRn Do ; x-5 ; suite du programme

On remarquera que de nombreuses boucles while ou for se convertissent aisment en boucles do. Le compilateur C peut en tirer parti pour optimiser le code assembleur gnr. 8.5.3 Appel de procdures et de fonctions Les aspects procduraux des langages de programmation sont plus dlicats grer au niveau assembleur, surtout lorsquil sagit de gnrer un programme optimis. Les problmes rencontrs sont de trois types : 1. le passage des paramtres et de la valeur de retour, sil y en a ; 2. la sauvegarde de ladresse de retour, stocke dans R7 par les instructions JSR et JSRR et utilise par RET pour retourner au programme appelant ; 3. la coexistence des valeurs stockes dans les registres par le programme appelant et la procdure appele. Le premier problme est facilement rsolu en choisissant des registres dtermins pour passer les arguments et rcuprer la valeur de retour dune fonction. Par exemple, le programme suivant effectue la multiplication de deux variables A et B laide dune fonction :
.ORIG x3000 LD R0, A LD R1, B JSR Mult HALT .FILL 2 .FILL 3 ; fonction de multiplication R2 AND R2, R2, #0 ADD R2, R2, R1 ADD R0, R0, #-1 BRp Loop RET

; premier paramtre ; deuxime paramtre ; appel de la fonction Mult

A B Mult Loop

R0

R1

10 Ce mcanisme est trs efcace car il ne fait pas intervenir la mmoire pour stocker les paramtres. Le deuxime problme ne se pose que dans le cas dappels imbriqus. Si ces appels ne sont pas rcursifs, il est possible de sauvegarder R7 dans dautres registres o dans des emplacements mmoire prdtermins lors des appels successifs. Le troisime problme ncessite la plupart du temps de faire appel la mmoire pour sauvegarder les donnes qui ne tiennent pas dans les 8 registres du LC-2 (7 en pratique, car R7 est dj associ ladresse de retour). On a alors le choix entre la sauvegadre des registres de lappelant juste avant le saut ou de lappel juste au dbut de la procdure. La sauvegarde dans lappelant permet doptimiser le nombre de registres nccessitant une sauvegarde, alors que la sauvegarde dans lappel facilite grandement le recensement des registres protger (et le debuggage) lors dappels imbriqus.1 Si les appels ne sont pas rcursifs, la sauvegarde proprement dite peut utiliser des emplacements mmoire prdtermins pour chaque appel ou pour chaque fonction. Voici un exemple de sauvegarde dans lappelant ou la formule A*B + C*D est calcule laide de la fonction Mult prcdente :
.ORIG x3000 LD R0, A LD R1, B JSR Mult ADD R2, R5, #0 LD R0, C LD R1, D JSR Mult ADD R5, R5, R2 HALT .FILL 2 .FILL 3 .FILL 4 .FILL 5 ; fonction de multiplication R2 AND R2, R2, #0 ADD R2, R2, R1 ADD R0, R0, #-1 BRp Loop RET

; ; ; ; ; ; ; ;

premier paramtre deuxime paramtre appel de la fonction Mult sauvegarde de R2 premier paramtre deuxime paramtre appel de la fonction Mult A*B + C*D

A B C D Mult Loop

R0

R1

8.5.4 La pile Dans le cas dappels rcursifs, les solutions prcdentes ne sont pas sufsantes. De plus, lorsque limbrication des appels est sufsante, sans ncessairement tre rcursive, ces mcanismes de sauvegarde statiques se montrent rapidement trs complexes ; plus grave, ils conduisent un gaspillage important de mmoire car de nombreuses zones de la mmoire sont inoccupes la plus grande partie du temps (lorsque la fonction correspondante nest pas en cours dexcution). Enn, lorsque les paramtres sont nombreux ou comportent des donnes complexes, leur passage par la mmoire est rendu obligatoire.
1

Les registres contenant les paramtres ne peuvent videment pas tre sauvegards dans lappel.

11 On appelle contexte dune fonction les donnes constitues de ladresse de retour, des paramtres, de la valeur de retour, des registres de lappelant protger, et des variables locales de cette fonction. La pile est une structure de donnes2 offrant une solution gnrale au problmes lis la sauvegarde du contexte lors de lappel de fonctions. Comme son nom lindique, elle fonctionne sur un mode LIFO : Last In First Out, voir la gure 8. En pratique, il sagit dune zone mmoire de taille importante (extensible au besoin, sur les processeurs modernes). Les donnes ne sont pas dplaces en mmoire : un pointeur/registre ddi indique ladresse du sommet de la pile ; sur le LC-2, il sagit du registre R6.

Haut de la pile

Contexte 3

sauvegarde de contexte

x3000 ... x3012 ...

Proc1 JSR Proc2

Contexte 2

Proc2 JSR Proc3

Contexte 1

x302A ...

Proc3 JSR Proc4

...

x3030

Proc4

F IG . 8 Sauvegarde de contexte dans la pile Par convention, le registre R6 est incrment lors de la sauvegarde de contexte et dcrment lors de sa libration. On reprend lexemple de la formule A*B + C*D en utilisant la pile :
.ORIG LD STR LD STR JSR LD LD STR LD STR JSR
2

x3000 R0, A R0, R6, R0, B R0, R6, Mult R0, R6, R1, C R1, R6, R1, D R1, R6, Mult

#0 #1 #0 #0 #1

; ; ; ; ; ; ; ; ; ; ;

passage du paramtre A passage du paramtre B appel de la fonction Mult lecture de A*B passage du paramtre C passage du paramtre D appel de la fonction Mult

En partie gre par le processeur, voir le chapitre suivant sur le systme dexploitation.

12
LD R1, R6, #0 ; ADD R0, R0, R1 ; HALT .FILL 2 .FILL 3 .FILL 4 .FILL 5 ; fonction de multiplication R2 R0 STR R7, R6, #2 ; STR R0, R6, #3 ; STR R1, R6, #4 ; STR R2, R6, #5 ; LDR R0, R6, #0 ; LDR R1, R6, #1 ADD R6, R6, #6 ; AND R2, R2, #0 ADD R2, R2, R1 ADD R0, R0, #-1 BRp Loop ADD R6, R6, #-6 lib STR R0, R6, #0 ; LDR R0, R6, #3 ; LDR R1, R6, #4 ; LDR R2, R6, #5 ; LDR R2, R6, #2 ; RET

lecture de C*D A*B + C*D

A B C D Mult

R1 sauvegarde de ladresse de retour sauvegarde de R0 sauvegarde de R1 sauvegarde de R2 lecture du premier paramtre ; lecture du deuxi rservation de 6 mots sur la pile

Loop

valeur de retour restauration de R0 restauration de R1 restauration de R2 restauration de R7

En raison du mode dadressage particulier du LC-2 seuls les offsets positifs sont autoriss on notera que lincrmentation de R6 seffectue aprs la sauvegarde du contexte, et que la dcrmentation de R6 seffectue avant la libration de celui-ci.

Das könnte Ihnen auch gefallen