hallo, ich arbeite mit assembler und avr's. in bascom und c hat man so schön viele verschiedene variablen und in assembler muss man sich mit 32 registern (mit den unteren 16 kann ich net arbeiten, weil ich nich weiß wie das geht :( ) abmühen. gibt es in asm vielleicht auch solche variablen die dann im flash gespeichert werden? wann ja wie geht das dann und wenn das nicht geht wie kann ich mit den unteren 16 registern arbeiten? mfg raoul
Klar kann man mit den unteren 16 Registern arbeiten, nur nicht mit Instruktionen mit "immediate"-Addressierung, d.h. die das Register mit einer Konstante verknüpfen. Für Rechenoperationen zwischen zwei Registern oder als MOV-Ziel sind die unteren Register durchaus geeignet. Und klar kann man Variablen anlegen (normalerweise im RAM) und mit ld(s) bzw. st(s) darauf zugreifen. Du solltest Dir mal die Assemblerbefehlsübersicht für AVRs angucken.
> viele verschiedene variablen und in assembler muss man sich mit 32 > registern (mit den unteren 16 kann ich net arbeiten, weil ich nich > weiß wie das geht :( ) abmühen. Die unteren 16 Register können halt nicht mit jedem Befehl genutzt werden. Sonst da nichts spezielles dran. Die Befehle, die auch immediate-Werte annehmen (ldi, cpi, ...) gehen z.B nicht, weil da zu wenig Bits übrig sind für die Registernummer. > gibt es in asm vielleicht auch solche variablen die dann im flash > gespeichert werden? Müssen die unbedingt im Flash stehen? Warum nicht ins RAM?
Vielleicht, weil die AVRs bedeutend mehr Flash als SRAM haben und man den Unterschied der verschiedenen Speicherarten noch nicht richtig kennt? ;-) ...
Hi Wo Variablen gespeichert werden sollte vom Verwendungsweck, Zugriffgeschwindigkeit und Lebensdauer der Variabalen (soweit man in Assembler von Variablen sprechen kann) abhängen. Ausserdem ist der der Speicherbedarf zu beachten. Beispiele: Große Datenmenge: Speicherort RAM und mit Pointer(X,Y,Z) zugreifen Daten, die nach Ausschalten erhalten bleiben sollen: Speicherort: EEPROM, evtl. Kopie bei Programmstart in RAM laden und nur bei Veränderung im EEPROM speichern. Übergabe an Unterprogramme (wenige,kleinere Variablen) Übergabe in Registern (vorzugsweise r16-r31) je nach Badarf mit push/pop sichern und restaurieren. ....... Fazit: Wie 'Variablen' in Assembler angelegt werden hängt von vielen Faktoren und auch vom Programmierstil ab. MfG HG
Manch aktuelle µController haben wesentlich weniger Register... Da ist man mit den 32 Registern des AVR ziemlich verwöhnt. Schau Dir mal die Befehle LD und ST an. "Variablen" im Flash sind keine Variablen, sondern Konstanten - d.h., sie lassen sich nicht verändern.
Um das alles mal zusammenzufassen: Es gibt drei Arten von Speicher im AVR, Flash, RAM und EEPROM. Im Flash steht primär der Programmcode. AVRs können Programmcode nur aus diesem Speicher heraus ausführen. Dieser Speicher kann auch für Daten genutzt werden, aber diese sind dann nur lesbar (schreiben geht zwar bei den meisten AVRs auch, aber das ist etwas umständlicher, langsam, und die Zahl an Schreibvorgängen ist stark begrenzt). Das eignet sich für fixe Tabellen und Konstanten. Der Flash ist bei AVRs immer der größte Speicher. Der Zugriff darauf erfolgt in Assembler mit lpm bzw. elpm. RAM ist der eigentliche Datenspeicher. Er kann sehr schnell und beliebig oft gelesen und geschrieben werden. Er verliert allerdings seinen Inhalt, wenn die Stromversorgung abgestellt wird. Er kann mit ld, ldd, lds gelesen und mit st, std, sts geschrieben werden. EEPROM ist der Speicher, um sich Daten über das Aus-/Einschalten hinweg zu merken. Er ist aber relativ langsam, vor allem beim Schreiben, und auch bei ihm ist die Zahl an Schreibzyklen begrenzt. Der Zugriff auf diesen erfolgt über I/O-Register und ggf. Interrupts (wird ausgelöst, wenn ein Schreibzugiff fertig ist).
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.