Hallöle,
hier liegt wohl ein Missverständniss der "Constraint"-Charakter im I/O-Bereich des ASM-Codes vor. Folgender geänderter Code liefert die gewünschte "42"...
void setup()
{
Serial.begin(9600);
}
void loop()
{
asmTest(42);
}
void asmTest( uint8_t argC )
{
uint8_t outC = 0;
asm volatile
(
"cnt: INC %[outA] \n\t"
" DEC %[argA] \n\t"
" BRNE cnt \n\t"
: [argA] "+r" (argC),
[outA] "+r" (outC)
:
);
Serial.println( outC ); // gibt 42 aus wie es sein sollte
}
Die "Constraints" sind nicht einfach zu verstehen und ich musste auch zuerst etwas "um die Ecke" denken, dann aber ging es sogar mit 32Bit-Werten...
Gute Info dazu >>> Inline Assembler Cookbook
Rudi
@RudiDL5 & Serenifly Danke, wenn man sowohl argC als auch outC mit + macht funktioniert es.
Seltsamerweise gibt es bei = bei outC weiterhin 52 aus (liegt es daran dass Incrementieren ja eig. nicht nur schreiben sondern lesen, um eins erhöhen und dann schreiben ist?)
@ michael_x er ist langsamer, mehrere Takte. Ich muss eine Ledleiste ansteuern, und 850-400ns pulse senden. Da ist die Zeit nicht drinnen. Außerdem könnte es sein dass eine andere Compilerversion das ganze schneller/langsamer macht -> funktioniert nicht auf jedem PC da die pulse genau so und so lang sein müssen.
@combie Dann muss ich aber die Ganze Funktion in asm schreiben. Das löst mein Problem nicht dass ich nicht in asm auf C(++) variablen zugreifen kann.
Seltsamerweise gibt es bei = bei outC weiterhin 52 aus (liegt es daran dass Incrementieren ja eig. nicht nur schreiben sondern lesen, um eins erhöhen und dann schreiben ist?)
Ich hatte es mit mehreren verschiedenen Argumenten probiert und es ging
Genau das selbe habe ich gerade auch festgestellt.
: [argA] "=r" (argC),
[outA] "+r" (outC)
:
und
: [argA] "+r" (argC),
[outA] "+r" (outC)
:
Liefern auf jeden Fall 42
(liegt es daran dass Incrementieren ja eig. nicht nur schreiben sondern lesen, um eins erhöhen und dann schreiben ist?)
So in der Art muss man das verstehen. Im Fall "+" setzt der Compiler 2 Register ein, damit er den Output nicht durch den Input überschreibt. Ist 'ne echt böse Falle