L'assembleur GNU as

Directives


Expressions

Mot-clé Taille Description
.byte 1 octet 1 caractère ou un entier de 8 bits
.half
.hword
.short
2 octets demi-mot
.word
.int
.long
4 octets entier ou flotant standard (1 registre)
.xword
.quad
8 octets entier ou flotant long (2 registres)
.octa 16 octets long long (4 registres)
(utilisé par les flotants uniquement)
.float
.single
4 octets simple flotant
.double 8 octets double flotant
.string
.ascii
variable Chaîne de caractères
.stringz
.asciz
variable + 1 Chaîne de caractères, terminée par 0

Constantes

Caractère Code ASCII 8 bits ` 'A' (=65)
` 'B' (=66)
Chaîne Code ASCII 8 bits "Hello world\n"
"Le résultat est %d.\n"
Nombre binaire commence par '0b' :
0b10111010101011
octal le premier chiffre est un '0' :
012715302455
hexadécimal commence par '0x' :
0x9870235abef
décimal -765193
flotant 987235.49872e-935

Sections

Deux (pour simplifier) sections distinctes sont générées dans tous les fichiers objets : la partie contenant le code assembleur, en lecture uniquement (appelée .text en anglais), et la partie contenant le code des données (appelée .data).
Les directives assembleur .text et .data servent à choisir dans quelle partie va être stoquée la suite du programme en cours de lecture. Ces directives peuvent apparaître en n'importe quel point du programme, mais pour plus de lisibilité, on place en général la partie .data en début de programme, et la partie .text ensuite.
On peut également utiliser la syntaxe : .section ".text" et .section ".data".

Alignement des données

Les données doivent être placées à des adresses respectant certaines contraintes : les mots de 2 octets à une adresse paire, les mots de 4 octets à une adresse divisible par 4, et ainsi de suite. On utilise pour cela la directive .align, suivie d'un chiffre (2,4,8), ou d'un mot clé word, long, ou quad.

Exemple :

	.data
	.align   4
	.int     42
	.align   8
	.double  -0.66e666

Symboles

label:
Ce type de directive permet de référencer des adresses (de data ou de text).
Attention cependant : une adresse est un entier de 32 bits. Par conséquent, pour placer une telle adresse dans un registre, il faut utiliser deux instructions assembleur (sethi, puis or), ou la pseudo-instruction set. Les instructions de branchement par contre sont relatives au %pc courant, et ne nécessitent donc pas cette manipulation.
Exemple :
! début du programme...

   mov   50, %o1      ! met la valeur 50 dans %o1
   mov   0, %o0       ! met la valeur 0 dans %o0
DeCadix:
   add   %o0,1,%o0    ! incrémente %o0
   cmp   %o0,%o1      ! compare %o0 à %o1
   ble   DeCadix      ! si %o0 <= %o1, va à DeCadix:
   nop                ! delay slot

! suite du programme... 

.global ou .globl permet de déclarer un symbole utilisable dans d'autres fichiers objets (.o) linkés à ce module lors de l'appel à ld. Attention, s'il n'y a qu'un source (assembleur), il faut déclarer un label portant le nom main: en global (cf. exemple ci-dessous).

Divers

Commentaires : tout ce qui suit le caractère ! sur une ligne est ignoré.

.include "file" : inclure un fichier...

Exemple :

! Ceci est un programme qui affiche "Hello world."
 
.data
        .align  8
mon_texte:
        .asciz  "Hello world.\n"
 
.text
        .align  4
        .global main
 
main:
        save    %sp,-64,%sp      ! nouvelle fenêtre de registres
 
        set     mon_texte,%o0    ! le paramètre de la fonction appelée est
                                 ! placé dans le registre %o0
        ! Remarque :
        ! set est la pseudo instruction remplacée par les deux appels suivants :
        !    sethi %hi(mon_texte),%o0
        !    or    %o0,%lo(mon_texte),%o0
 
        call    printf,0         ! appel de la fonction printf
        nop                      ! delay slot
 
        mov     0,%i0            ! valeur de retour de la fonction main : 0
 
        ret                      ! retour de la fonction
        restore                  ! libère la fenêtre de registres pendant le
                                 ! delay slot