Ich will nicht zwei ganze Register miteinander vergleichen, wie in
diesem Beispiel aus dem Tutorial, sondern ich möchte z.B. r17(BIT3) mit
r16(BIT0) vergleichen, aber ich weis nicht, wie ...
cp r17, r16 ; vergleiche r17 mit r16, ich will aber zwei
Bits
; miteinander vergleichen aus den Registern
brne nicht_gleich
...
rjmp weiter
nicht_gleich:
...
weiter:
Achso, die Registerwerte sollen nicht verändert werden? Schmeiß sie mit
push auf den Stack und hole sie mit pop wieder runter oder mache mit mov
ne Kopie.
Hi
>andi r16,(1<<bit)>andi r17,(1<<bit)>cp r16,17>brne ...
Das funktioniert nicht.
>Achso, die Registerwerte sollen nicht verändert werden? Schmeiß sie mit>push auf den Stack und hole sie mit pop wieder runter oder mache mit mov>ne Kopie.
Geht auch ohne:
spess53 schrieb:> Hi>>>andi r16,(1<<bit)>>andi r17,(1<<bit)>>cp r16,17>>brne ...>> Das funktioniert nicht.
Wieso? Wenn beide Bits an der selben Stelle sind geht das doch prima.
> Geht auch ohne:
Ja ok, war ja auch noch früh.
Hi
>Wieso? Wenn beide Bits an der selben Stelle sind geht das doch prima.Magische Fee schrieb:> ich möchte z.B. r17(BIT3) mit r16(BIT0) vergleichen,
Sind halt nicht an der gleichen Bitposition.
MfG Spess
Hallo Spess53,
hab ich das jetzt richtig verstanden - ich kopiere aus Register 17 mein
gewünschtes Bit in das T-Flag und mit den Befehlen sbrs/sbrt wird dann
mein gewünschtes Bit des Registers 16 mit dem T-Flag verglichen?
Sorry, aber da muss man erstmal echt drauf kommen, ich habe gestern über
drei Stunden versucht, das hinzubekommen und habe als die
Assemblerbefehle angeschaut und versucht, mir eine Lösung
zurechtzubiegen, was nicht klappte.
Herzlichen Dank für Deine Ausführungen und auch danke an Frühaufsteher,
ich werde beides einfach mal im AVR-Studio ausprobieren und schauen, was
passiert.
spess53 schrieb:> Hi>>>Wieso? Wenn beide Bits an der selben Stelle sind geht das doch prima.>> Magische Fee schrieb:>> ich möchte z.B. r17(BIT3) mit r16(BIT0) vergleichen,>> Sind halt nicht an der gleichen Bitposition.>> MfG Spess
Ach verflixt, das hab ich überlesen. Man sollte halt nicht vor dem
ersten Kaffee im Forum posten. ;-)
Hi
>hab ich das jetzt richtig verstanden - ich kopiere aus Register 17 mein>gewünschtes Bit in das T-Flag und mit den Befehlen sbrs/sbrt wird dann>mein gewünschtes Bit des Registers 16 mit dem T-Flag verglichen?
Nicht direkt verglichen. Aber zu den Sprungbefehlen kommst du nur, wenn
das Bit in r16 einen bestimmten Zustand hat.
Ich habe das ganze mal in ein Macro gepackt:
Peter Dannegger schrieb:> Oder: .macro cp_bits ; Register1,Bitnummer1,Register2,Bitnummer2> clr r0> sbrc @0,@1> inc r0> sbrc @2,@3> inc r0> ror r0> .endmacro>> ; Aufruf (dein Beispiel):>> cp_bits r16,3,r17,0> brcc ... ; wenn gleich> brcs ... ; wenn nicht gleich>>> Peter
cool, danke für die Idee mit dem Makro. Eine Frage hab ich noch zu
Makros, die Teile &0,&1,&2,&3 entsprechen ja so wie ich es sehe z.B.
int macro (int a, int b, int c, int d)
{
int returnwert;
jetzt kann ich a,b,c und d verwenden - Integer nur als Beispiel.
Wenn ich nun einen Wert zurückliefern möchte
return(returnwert)
}
geht das auch in assembler, dass ich beispielsweise schreibe:
cp_bits r20,r16,0,r17,5
und nun könnte das Makro die Variable r20 praktisch als Rueckgabewert
zurückliefern, dass wäre sehr praktisch.
Magische Fee schrieb:> und nun könnte das Makro die Variable r20 praktisch als Rueckgabewert> zurückliefern, dass wäre sehr praktisch.
ich hab mich unpraktisch ausgedrückt, ich möchte, dass ich mit dem
übergebenen Wert in r20 in dem Makro auch etwas rechnen kann und der
veränderte Wert zurückgeliefert wird, was in c wahrscheinlich so wäre
int makro (int Zaehler, int Reg1, int Bit1, int Reg2, int Bit2)
{
Bitvergleichsoperationen...
Zaehler++;
return Zaehler;
}
int main ()
{
int Anzahl=0;
...
Anzahl = makro (Anzahl, Register1, Bit1, Register2, Bit2);
}
dass halt in Assembler.
Hi
>geht das auch in assembler, dass ich beispielsweise schreibe:>cp_bits r20,r16,0,r17,5
Ja. Aber was soll das für ein Rückgabewert sein? In den Macros von Peter
und mir wird das Z-Flag als Rückgabewert verwendet. Du kannst also mit
breq/brne sofort auf das Ergebnis reagieren.
MfG Spess
Nein, ein Makro ist keine Funktion bzw. ein Unterprogramm!
Statt eines Funktionsaufrufes erfolgt nämlich eine Ersetzung des Makros
zur Kompilierzeit. Zwar machen dies einige Compiler auch bei Funktionen,
dies aber nur dann, wenn es keine Seiteneffekte geben kann.
Das Äquivalent zum Assembler-Makro ist in C das Makro des Präprozessors:
spess53 schrieb:> Ja. Aber was soll das für ein Rückgabewert sein? In den Macros von Peter> und mir wird das Z-Flag als Rückgabewert verwendet. Du kannst also mit> breq/brne sofort auf das Ergebnis reagieren.
Ja, Du hast recht, dass ist der Befehl in Euren Makros clz/sez
Mein Gedankensprung war grad, wenn ich eine Vergleichsoperation oft
aufrufen muss und eine Registervariable bearbeite, dann muss ich immer
wieder mit den zwei Befehlen im Hauptprogramm breq/brne wieder
auswerten, Sprungmarken setzen ..., wenn ich das gleich auch noch in dem
Makro erledigen könnte, dann würde das Schreibaufwand sparen. Auch würd
ich gleich lernen, wie das noch geht. In den Lernunterlagen von mir,
die ich als Drucksache zu Haus liegen hab, gibt es z.B. den Befehl
.makro garnicht drinnen, dass wird dort garnicht erwähnt.
Ich finde z.B. die Anweisung .macro auch garnicht in dem Datenblatt von
dem verwendeten uC Atmega48. Ich find da auch garnicht Befehle wie
.cseg, .exit, .include ..., stehen diese Anweisungen bei Atmel in einem
gesonderten Schriftstück?
Hi
>stehen diese Anweisungen bei Atmel in einem gesonderten Schriftstück?
Das sind auch keine Befehle sondern Assembler Direktiven. Beschreibung
findest du unter AVR Studio Hilfe->AVR Assembler->User's
Guide->Directives
oder AVR Studio-> Help -> Assembler Help
Weiter Interessant: AVR Assembler 2 ->Preprocessor.
MfG Spess