hallo
wenn ich
asm
{
swapf portd
}
habe und dass Teil eines C++ Programms ist, bekomme ich ständig den
error: error in built-in assembly beim builden.
woran könnte das liegen?
Ich habe jetzt keine Ahnung um welchen Controller/Assembler es geht, aber ich kann mir schwer vorstellen, dass swapf auf einem Port funktioniert. Leg den Wert mal in einem Register ab, führ' dann das swapf aus und leg das Ergebnis wieder auf den Port. Gruß Kai
Ich schreibs für einen PIC 16f877a könnte das so gehen (hab noch nie wirklich ASM programmiert) asm { bsf temp movf portd,temp swapf temp movf temp,portd } ???
Bei den meisten Assembler-Sprachen ist der erste Parameter einer MOV-Anweisung das Ziel also
1 | |
2 | |
3 | |
Was macht 'bsf'? Anstelle von temp muss der Name eines Registers eingetragen werden. Lies dich mal durch den Befehlssatz des Controllers durch - da steht eigentlich alles drin. Alternativ solltest du mal ein Tutorial durcharbeiten. Ich kenne die PICs selbst gar nicht - die Frage sollte dir aber jeder PIC-Programmierer beantworten können. Für einen einzelnen Befehl macht es meist keinen Sinn den Inline-Assembler zu bemühen. Der Overhead oft größer, als eine reine C-Implementation.
Der Befehl swapf braucht insgesamt 2 Parameter denn nach der Quelle ( hier portd bzw. temp) muss noch das Ziel benannt werden. Da käme in Frage: 1, d.h. Ziel ist gleich Quelle oder 0 dann wird das Ergebnis in das wreg geschrieben. Für den o.g. Fall wäre also richtig swapf portd,1
Das hab ich schon probiert, weil ich mir den Befehl im Datasheet angesehen habe, aber dann bekomm ich den Error: error: unknown assembly identifier 'portd' (did you forget to put '_' in front of variable name)
Manchmal ist die Schreibweise entscheidend, vielleicht geht PORTD oder der Compiler hat eine eigene Ansicht darüber wie der Port D heissen soll.
habs jetzt danke!!! Der Befehl muss so aussehen: _ da ich damit ja einen Port anspreche. swapf _portd,1
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.