L'assembleur en ligne x86

PureBasic permet d'inclure toute commande assembleur x86 (y compris les instructions MMX et FPU) directement dans le code source comme dans un vrai source assembleur. Vous pouvez également utiliser directement les variables ou pointeurs avec les instructions assembleur et pouvez intégrer plusieurs commandes assembleur sur une même ligne. La syntaxe est celle de FAsm (http://flatassembler.net), la lecture du guide FAsm est recommandée si vous souhaitez plus d'informations sur la syntaxe.

Il existe plusieurs façons d'activer l'assembleur en ligne:
- Cochez la case "Activer l'assembleur en ligne" via l'IDE dans les Options du compilateur
- Utilisez le paramètre /INLINEASM en lançant le compilateur Utiliser le compilateur SHELL
- Utilisez les directives du compilateur EnableASM et DisableASM

Règles

Vous devez respecter plusieurs règles précises pour inclure de l'assembleur dans un source Basic:

- Les variables et les pointeurs utilisés doivent être déclarés préalablement à leur utilisation dans un contexte assembleur
- Lorsque vous faites référence à un label vous devez précéder son nom par un 'l_'. Cette règle est due au fait que PureBasic place un 'l_' devant les labels BASIC pour éviter les conflits avec les labels internes. Le label référencé en assembleur doit être en minuscule.

Exemple:

  MOV ebx,l_monlabel
  ...
  MonLabel:
- Les erreurs dans une section asm ne sont pas reportées par PureBasic mais par FAsm. Vérifiez votre code si une telle erreur survient.
- Les registres volatiles sont: eax, edx et ecx. Tous les autres doivent être préservés.

Quand on utilise l'assembleur dans une procédure, il est utile de connaître les points suivants:
- Pour renvoyer directement la valeur du registre 'eax' comme valeur de retour, il suffit d'utiliser ProcedureReturn, sans paramètre. Le contenu du registre 'eax' restera inchangé et sera utilisé comme valeur de retour.

Exemple:

  Procedure.l MyTest()
    MOV eax, 45
    ProcedureReturn  ; La valeur de retour sera 45
  EndProcedure
- Les variables locales en PureBasic sont directement indexées par rapport au registre de la pile (ESP) ce qui implique qu'un changement de la valeur de ce registre par une instruction assembleur (tel que PUSH, POP etc..) la référence vers la variable ne sera plus correcte.

- Il est possible de passer directement une ligne complète à l'assembleur sans aucune modification en utilisant le caractère '!' en début de ligne. Ceci permet d'avoir un accès total aux fonctionnalités de l'assembleur. Pour faciliter l'accès aux variables locales, une notation a été mise en place: 'p.v_NomVariable' pour une variable standard et 'p.p_NomPointeur' pour un pointeur.

Exemple:

  Procedure Test(*Pointer, Variable)
    ! MOV dword [p.p_Pointer], 20
    ! MOV dword [p.v_Variable], 30
    Debug *Pointer
    Debug Variable
  EndProcedure
  
  Test(0, 0)

Exemple

AsmInline.pb