Hi! Ich popel seit Anfang an mit dem AVR-Studio rum und bin wieder mal auf ihn reingefallen. Habe die Version 4.10 und folgendes Problem: .cseg .equ C=(20-B)/2 .equ D=A*64+C ...... Code: ldi r17,C ..... cpi r17,D brlo ... ..... .dseg .equ A=2 .equ B=16 Array: .byte A*B Das Problem dabei ist, das der ASM für die Variablen C und D einfach nur nullen einfügt und mich ohne einer Fehlermeldung im Regen stehen läßt. Natürlich kommt dann erst mal wieder laaange Fehlersuche und Haare raufen. Mußte das dann so ändern, damit alles stimmt: .equ A=2 .equ B=16 .cseg .equ C=(20-B)/2 .equ D=A*64+C ...... Code: ldi r17,A ..... cpi r17,D brlo ... ..... .dseg Array: .byte A*B Also die Variablen C und D welche im Code benutzt werden vor diesen Code stellen. Da ich aber gerne wie im ersten Beispiel alles der Zugehörigkeit wegen beinander habe, gibt es ne Möglichkeit das Assemblieren zu verbessern mittels ändern der Einstellungen im AVR-Studio? Denke da an so was wie "2-pass" oder irgend so was. Gruß Andi
Nimm mal anstelle von .equ C = ... .equ D = ... besser .set C = ... .set D = ... EQU ist eine Konstantendefinition, SET eher eine Variablenzuweisung, die sich auch im 2. Pass noch ändern kann. Im übrigen kommt bei mir zwar keine Fehlermeldung, aber zumindest eine Warnung. Gruß Ingo
Ein Assembler kann keine Variablen verwalten. Variablen werden nur in Hochsprachen automatisch angelegt und verwaltet. Mit .EQU definierst Du Konstanten, die zur Assemblezeit ausgerechnet und dann durch den ermittelten Wert ersetzt werden. Diese werden auch genau in der Reihenfolge des Quelltextes abgearbeitet. Eine Ausnahme bilden Ausdrücke mit Labels weiter hinten, nur die werden im 2. Durchlauf berechnet. Blöd ist natürlich, wenn der Assembler einen noch nicht bekannten Ausdruck stillschweigend durch 0 ersetzt, statt einen Fehler zu melden. Peter
So stillschweigend tut er es ja auch nicht, er gib eine Warnung aus: "warning : Undefined variable referenced" Wer natürlich Warnungen generell nicht ernst nimmt, ist selber Schuld :-) Andererseits verhalten sich mit .SET definierte Labels eben doch so ähnlich wie Variablen. Der Wert kann zu jeder Zeit, anders als bei .EQU, geändert werden. Gruß Ingo
@Ingo: Gelesen, getan! Klappt prima. Habe gerade in der Onlinehilfe nachgelesen und da steht in der Übersicht EQU - Set a symbol equal to an expression und SET - Set a symbol to an expression. Scheint fast identisch zu sein wo bei in der Hilfe ganz unten über SET das gleiche steht wie über EQU. Vielleicht Tippfehler. Auf jeden Fall beachtet SET die Symnolics die erst noch kommen im gegensatz zu EQU. Sollte vielleicht nur noch SET benutzen. Das mit den Warnings ist halt so ne Sache. Da die Warnungen normalerweise nur die .db-Felder mit ungrader Anzahl Bytes betreffen achte ich nicht so drauf und schau mir nur die roten Meldungen an. :-) Sollte ich wohl ändern. Gruß Andi
Hallo, entschuldigt, dass ich den Thread ausgrabe, aber... um ein Programm für die Zukunft uns spätere Anwendungen portierbar zu machen habe ich im Assembler-Code desöfteren Werte folgendermaßen definiert .equ XTAL=4000000 ... ldi r17=(XTAL/100000) ... was passiert, wenn später ungerade Xtal-Werte eingetragen werden bspw (XTal=4 166 666)? Rundet das AVR Studio!? Auf/ab? Was ist die Konvention? Viele Grüße Ben
Benhasi wrote: > ldi r17=(XTAL/100000) Das geht gar nicht. Schau Dir mal die Syntax der Assembler-Befehle an. Oder war es nur ein Tippfehler? > d.h. es AVR Studio gibt einen Fehler aus oder rundet?? Gerundet wird gar nichts. Wie auch in C wird eine Berechnung in ganzen Zahlen durchgeführt und der Nachkommaanteil einfach abgeschnitten.
Hallo, ja, war ein Tippfehler! Danke für die Antwort, es funktioniert also, produziert nur eine kleine aber akzeptable Ungenauigkeit! Aber kleine Spitzfindigkeit: den Nachkommateil zu vernachlässigen, nennt man das nicht Abrunden? ;-) Viele Grüße Ben
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.