2017-08-20 7 views
1

Je suis en train d'obtenir la pile d'appel, pour une raison quelconque le code suivant renvoie un pointeur mal de pile:Comment obtenir la valeur du pointeur de la pile? (MIPS GCC)

 unsigned int stack_pointer = 0; 
     __asm("la $26, %[spAddr]\n\t" 
       "or $27, $0, $sp\n\t" 
       "sw $27, 0($26)\n\t" 
       "nop"::[spAddr] "m" (stack_pointer)); 
     return stack_pointer; 

Qu'est-ce que je manque ici?

+0

Vous ne déclarez aucun paramètre de sortie (déclaré après le 1er signe deux-points). Où pensez-vous que les choses vont être retournées? Voir les [docs] (https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#OutputOperands). –

Répondre

3

Pour obtenir le pointeur de pile utiliser la contrainte de sortie appropriée comme ceci:

register unsigned sp asm("29"); 
asm("" : "=r" (sp)); 

Notez que MIPS utilise un registre pour l'adresse de retour, mais bien sûr, les fonctions non-feuille peut stocker sur la pile.

Pour mettre en œuvre une rétrospection, vous pouvez cependant utiliser les fonctions intégrées __builtin_return_address et __builtin_extract_return_addr comme décrit dans le gcc manual. En outre, si la glibc est disponible, elle a déjà la fonction backtrace, voir man backtrace.