2015-03-12 1 views
0

Im essayant de convertir quelque chose en Cen ligne x86 pour diviser par 2 en C

int div 
div = div/2; 

en assembleur en ligne ATT x86 en utilisant décalage vers la droite (SAR)

asm("sar %0" : "=r"(div)); 

mais je ne pouvais pas pour travailler. Toutes les idées seraient grandement appréciés

+1

est-ce pas quelque chose tout compilateur décent sait déjà comment faire? – Thilo

+0

@Thilo Oui, mais disons que pour apprendre, j'aimerai toujours connaître la bonne façon d'écrire quelque chose comme ça. –

+1

Tout compilateur décent sait que/2 est >> 1, et tout programmeur décent sait que >> 1 est/2. – user3528438

Répondre

3

En utilisant =r, vous dites au compilateur que la valeur existante dans div est écrasée par le asm. Pour lui dire que vous êtes à la fois la lecture et l'écriture de la valeur div dans l'asm, utilisez +r (voir https://gcc.gnu.org/onlinedocs/gcc/Modifiers.html):

asm("sar %0" : "+r"(div)); 
+0

Avoir ma +1 pour être un de ces magiciens en ligne-GAS-noir. –

+0

Génial !! Merci pour la réponse et le lien. Je vais lire dessus maintenant. –