Folco (./37) :
Et si ça ne peut plus linker, il me le fera savoir. Si à l'inverse je veux un bsr.w, je lui dirai également, et ma volonté sera exécutée. Si enfin je m'en fous, je lui laisse faire au mieux.
Ouaip, mais je vois mal pourquoi tu voudrais explicitement choisir le type de saut car ça ne peut apporter que des désavantages si tu te trompes, rien si tu fais juste. (et si tu veux faire du code auto-modifiant, il existe d'autres moyens, mais c'est une mauvaise pratique question sécurité de toute façon).
Perso j'ai pas mal fait de l'assembleur MIPS par exemple, où un grand nombre d'opérations sont symboliques. Exemple:
- Si tu veux faire un branch "b Label" tu fais en réalité un branch if greater than zero, avec le registre $0 (câblé à la valeur zéro) comme opérande.
- Un "move $dest, $source" fait "add $dest, $source, $0"
- Un "not $dest, $source" fait un "nor $dest, $source, $zero"
- etc.
Techniquement l'overhead ne coûte rien (ça prend un cycle, c'est encodé dans les 32 bits de l'instruction comme tout le reste, et ça économise la complexité d'avoir plus d'instructions). Tu as également des instructions qui peuvent se subdiviser en plusieurs. Par exemple, load immediate (32 bits) "li $dst 0x12345678" fera:
lui $dst, 0x1234 # (load 16 upper bits)
add $dst, $dst, 0x5678 # (add lower bits)
Enfin, il y a même un registre réservé à l'assembleur pour stocker le résultat temporaire de certaines instructions. Evidemment, tu connais la liste des instructions "réelles" et "symboliques", mais ces dernières sont bien pratiques en fin de compte
