2016-11-23 14 views
0

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 B
void 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.

+0

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. –

+0

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. –

+0

@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. –

Antwort

3

Kombination alle Kommentare in einer Antwort:

Ich weiß nicht viel über ARM, ist aber nicht a2 nur ein alternativer Name für r1 (pro this)? Wenn dem so ist, scheint es eine schlechte Idee zu sein, beides so zu benutzen.

Und wie Peter erwähnte, könnte ich hier einen "Speicher" Clobber sowie "cc" verwenden.

Es scheint auch, dass mov a3, %[N] nicht notwendig ist. Es sieht so aus, als könntest du einfach% [N] benutzen (was schon ein Register ist) und dir ein Register sparen.

Und schließlich, meine Standard-Kommentare darüber, warum Sie nicht gcc's Inline-Asm verwenden sollten ist here.

+0

Oh ja, guter Punkt über einen '" cc "' Clobber. Einfach zu vergessen, da es auf x86 impliziert ist. –