Hallo, ich habe eine Funktion, die - natürlich - Variablen anlegt und verwendet. Nun möchte ich herausfinden, ob dafür die Register des AVR verwendet werden oder diese im SRAM abgelegt werden (oder beides). Gibt es eine Möglichkeit zu sehen, wo der Compiler die Variablen "hinlegt"? Weil so in den Assemblercode zu schauen scheint mir etwas unübersichtlich ... Viele Grüße, Luke
Luke schrieb: > Gibt es eine Möglichkeit zu sehen, wo der Compiler die Variablen > "hinlegt"? In den Assemblercode schauen. > Weil so in den Assemblercode zu schauen scheint mir etwas > unübersichtlich ... Man kann nicht alles haben :-)
Du kannst natürlich auch mit Debugging übersetzen und dir die entsprechende Info im Ergebnis anschauen (readelf -w).
Falls es sich um das GNU handelt: Dazu gibt es, ich glaube im How-To oder in den FAQ, eine Beschreibung über die verwendeten Register im Zusammenhang mit "C". Darüber hinaus verhält sich das Teil wie jeder andere Compiler: Sind keine, dafür freigegebenen Register mehr verfügbar, so muss das RAM herhalten.
Luke schrieb: > Nun möchte ich herausfinden, ob dafür die Register des AVR > verwendet werden oder diese im SRAM abgelegt werden (oder beides). Außer der Ablage der Variable in einem Register oder im SRAM (statisch oder Stack), gibt es noch weitere Möglichkeiten, was damit passieren kann: - Die Variable wird komplett eliminiert, weil ihr Inhalt nirgends benötigt wird. - Eine oder mehrere Variablen werden durch eine oder mehrere neue Variablen mit anderem Inhalt, aber gleichem Informationsgehalt ersetzt. Um all diese Fälle und die logischen Zusammenhäbge zu Gesicht zu bekommen, führt praktisch nichts am Assemblercode vorbei. Bei den GNU-Tools kann bekommt man mit den folgenden Compiler-Optionen man ein Assemblerlisting mit wertvollen zusätzlichen Informationen geliefert:
1 | avr-gcc -mmcu=atmega8 -Os -c -fverbose-asm -Wa,-adhln -g avrtest.c >avrtest.lst |
Es enthält: - natürlich den Assemblercode selbst - die C-Quellcodezeilen, aus denen der Assemblercode entstanden ist - hinter den einzelnen Assemblerbefehlen als Kommentar die lokalen oder globalen Variablennamen, auf die sich die Befehlsargumente beziehen Oftmals haben diese Variablen komische Namen, die im C-Programm gar nicht auftauchen. Das sind dann entweder temporäre Variablen oder die oben erwähnten Ersatzvariablen. Alternativ dazu könntest du dir auch die RTL-Dumps anschauen, aber ohne die genaue Kenntnis der Syntax sind diese noch viel schwerer als der Assemblercode zu lesen.
Im AVR Studio dürfte es am einfachsten sein, das Programm im Debugger zu starten und einen Unterbrechungspunkt dort setzen, wo die Variable benutzt wird. Dann einfach drauf zeigen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.