Ich habe gerade angefangen, Montage in einer meiner Klassen zu lernen und habe Probleme beim Schreiben eines Programms, das zwei Arrays und vergleicht jedes Element, dann speichert den größeren Wert zurück in das erste Array.Sehr einfache Vergleichsfunktion funktioniert nicht
mein Code hier mit quälend elementaren Kommentare ist (beachten Sie, dass diese auf einem Arduino, die asm pseudo-Funktion daher lief wird):
mein Programm gibt die gleiche Arrays A zurück und Bvoid sort1 (char *A, char *B, int N) {
asm(
"mov a1, %[A];" // Move address A into a1
"mov a2, %[B];" // Move address B into a2
"mov a3, %[N];" // Move array size N into a3
"mov r1, #0;" // r1 = 0
"L1: cmp r1, a3;" // compare r1 and N
"it ge;"
"bge end;" // if r1 >= N, jump to end (end condition of for loop is met)
"ldrb v1,[a1];" // load a1 into v1
"ldrb v2,[a2];" // load a2 into v2
"cmp v1, v2;" // compare v1 and v2
"it lt;" // if v1 is less than v2
"strblt v2,[a1];" // store v2 in a1
"add a1, #1;" // go to next element in array A
"add a2, #1;" // go to next element in array B
"add r1, #1;" // r1 = r1 + 1, equivalent to "i++"
"b L1;" // branch to beginning of loop
"end:"
: : [A]"r"(A), [B]"r"(B), [N]"r"(N) // Substitute C++ variables
: "a1", "a2", "a3", "r1", "v1", "v2" // Place any registers used here to not clobber
);
}
Aktuell unabhängig von einem Wert in B ist größer als der in A.
Jede Hilfe wird sehr geschätzt. Entschuldigung, das ist so eine einfache Frage, die wahrscheinlich eine sehr einfache Lösung hat, aber das meiste davon war selbstlernend und ich habe Mühe herauszufinden, wo das Problem liegt.
Sie vermissen einen '' memory '' Clobber, damit der Compiler weiß, dass Sie Speicher schreiben (und lesen), der kein Eingabeoperand ist. IDK, wenn das zählt. Ich würde wärmstens empfehlen, die ganze Funktion in pure asm (in einer '.S' Datei) zu schreiben, nicht inline-asm in C. Das ist der schwerste Weg asm zu lernen. –
Haben Sie versucht, es in einem Debugger einzeln zu durchlaufen? Wenn der Compiler nicht das tut, was Sie erwarten, haben Sie eine gute Chance zu bemerken, wenn Sie Ihren Code und den vom Compiler generierten Code einzeln ausführen. –
@PeterCordes Das schien nicht zu helfen, nein. Und ich würde das tun, aber wir schreiben mehrere Funktionen in eine .ino-Datei, um mit dem seriellen Monitor des Arduino zu interagieren, also sind wir leider gezwungen, es auf diese Weise zu machen. - Mit der Arduino-IDE sind wir nicht wirklich zu sehr ins Detail gegangen, so dass ich nicht genau weiß, wie ich das machen soll. –