Forum: Mikrocontroller und Digitale Elektronik Problem mit swapf


von Mark K. (spliff)


Lesenswert?

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?

von Kai G. (runtimeterror)


Lesenswert?

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

von Mark K. (spliff)


Lesenswert?

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
  }

???

von Kai G. (runtimeterror)


Lesenswert?

Bei den meisten Assembler-Sprachen ist der erste Parameter einer 
MOV-Anweisung das Ziel also
1
movf temp, portd
2
swapf temp
3
movf portd, temp

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.

von Dieter W. (dds5)


Lesenswert?

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

von Mark K. (spliff)


Lesenswert?

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)

von Dieter W. (dds5)


Lesenswert?

Manchmal ist die Schreibweise entscheidend, vielleicht geht PORTD oder 
der Compiler hat eine eigene Ansicht darüber wie der Port D heissen 
soll.

von Mark K. (spliff)


Lesenswert?

habs jetzt danke!!!

Der Befehl muss so aussehen:
_ da ich damit ja einen Port anspreche.
swapf _portd,1

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
Noch kein Account? Hier anmelden.