2017-10-14 18 views
0

En utilisant GCC et inline assembly, je veux charger immédiatement dans un registre spécifique r0. Cependant, je n'obtiens pas les bons résultats.PowerPC Inline Assembly: Charger la valeur C dans le registre

unsigned short value = 0x1337; 

asm volatile 
(
"li 0, %0\n\t" 
     "sc\n\t" 
     "blr" 
: /* Output registers */ 
:"r"(value) /* Input registers */ 
: /* No clobbered registers */ 
); 

Lors de la compilation, cela donne

li  r0, 9 
sc 
blr 

Où le 9 vient? Je voulais plutôt la valeur spécifiée 0x1337. Here est un tutoriel que j'ai regardé.

Répondre

2

9 est le registre contenant 0x1337, ce qui est exactement ce que vous avez demandé. Notez comment value est un registre d'entrée? 9, a.k.a. r9, est un registre d'entrée parfaitement valide. C'est la sortie d'assemblage que je reçois.

li 9,4919 
    li 0, 9 
    sc 
    blr 

Si vous voulez charger 0x1337 immédiatement, utilisez-le à la place.

asm volatile (
    "li 0, 0x1337\n\t" 
    "sc\n\t" 
    "blr" 
); 

Ou, il suffit d'utiliser la contrainte "i" au lieu de la contrainte "r".

asm volatile (
    "li 0, %0\n\t" 
    "sc\n\t" 
    "blr" 
    : 
    : "i"(0x1337) 
); 
+0

Oui, sans surprise qui était une solution simple – BullyWiiPlaza

+0

@BullyWiiPlaza: Utilisez gcc -mregnames' pour obtenir les noms de registre qui ne sont pas simples chiffres, de sorte que vous ne pouvez pas mélanger les registres et immediates. Aussi, assurez-vous de dire au compilateur à propos des registres que vous cloberez, et utilisez 'asm goto' pour lui dire que vous sautez. Bien que je ne sois pas sûr qu'il existe un moyen sûr de dire au compilateur que votre asm a besoin de l'adresse de retour dans 'lr' et qu'elle retourne. Vous devriez probablement écrire toute votre fonction dans asm, parce que je ne vois pas comment cela peut fonctionner s'il est en ligne. –

+0

@PeterCordes: Oui, c'est toute la fonction. :) – BullyWiiPlaza