Maison >développement back-end >C++ >Pourquoi mon assemblage en ligne utilisant le registre de pointeur de base (%rbp) provoque-t-il une erreur de segment en C ?
Utilisation du registre de pointeur de base dans C Inline ASM
Question :
J'essaie pour utiliser le registre de pointeur de base (%rbp) dans l'assembly en ligne. Cependant, lorsque j'accède à la variable après l'asm en ligne, le programme échoue. L'extrait de code ci-dessous illustre le problème :
void Foo(int &x) { asm volatile ("pushq %%rbp;" "movq %%rsp, %%rbp;" "subq , %%rsp;" "movl , -12(%%rbp);" "movq %%rbp, %%rsp;" "popq %%rbp;" : : : ); x = 5; }
Diagnostic du problème :
La segmentation de code échoue car elle écrase une valeur stockée dans la "zone rouge" sous RSP. , que GCC utilise pour stocker un value.
Solution :
Pour éviter ce problème, allouez un espace de travail pour votre asm en ligne à l'aide d'un opérande de sortie "= m" ou ignorez explicitement la zone rouge en utilisant l'instruction inférieure à -128 $, %rsp. Vous pouvez également éviter d'utiliser l'espace de travail en premier lieu et laisser le compilateur allouer et enregistrer les registres pour vous.
Meilleures pratiques pour l'ASM en ligne :
Conseils supplémentaires :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!