2017-08-20 2 views
1

Ich versuche, den Call-Stack zu bekommen, aus irgendeinem Grund die folgenden Code einen falschen Stapelzeiger zurückgibt:Wie erhält man den Wert des Stackpointers? (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; 

Was bin ich hier?

+0

Sie deklarieren keine Ausgabeparameter (nach dem 1. Doppelpunkt deklariert). Wo erwartest du, dass Dinge zurückgegeben werden? Siehe [docs] (https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#OutputOperands). –

Antwort

3

Um den Stapelzeiger verwenden, um die richtige Ausgabebedingung wie so zu erhalten:

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

Beachten Sie, dass Mips ein Register für die Absenderadresse verwendet, aber natürlich nicht-Blattfunktionen könnten es auf dem Stapel speichern.

Um ein Backtrace zu implementieren, können Sie jedoch die eingebauten __builtin_return_address und __builtin_extract_return_addr wie in der gcc manual beschrieben verwenden.

Auch wenn glibc verfügbar ist, hat es bereits backtrace Funktion, siehe man backtrace.

Verwandte Themen