2016-11-23 18 views
0

私はクラスの1つでアセンブリを学習し始めたばかりで、2つの配列をとり、各要素を比較して最初の配列に大きな値を戻すプログラムを書くのに問題があります。非常に単純な比較関数が動作しない

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 
); 
} 

現在、私のプログラムがバック与えている同じ列AとB:ここ

は耐え難いほど基本コメントを自分のコードである(これはアルドゥイーノに、したがってASM擬似機能を実行中であることに留意されたいです) Bの値がAの値より大きいにもかかわらず。

何か助けに感謝します。申し訳ありませんが、このような簡単な質問ですが、これはおそらく非常に単純な解決策ですが、そのほとんどは自己学習型であり、問​​題のどこにあるのか分かりません。

+0

あなたは、入力オペランドではないメモリの書き込み(および読み出し)をコンパイラに知らせるための ''メモリ '' clobberがありません。それが重要なのならIDK。私は非常に純粋なasm( '.S'ファイル)で、Cのインラインasmではなく、関数全体を書くことをお勧めします。これはasmを学ぶ最も難しい方法です。 –

+0

デバッガでシングルステップ実行しようとしましたか?コンパイラが期待したことをしていない場合は、コードからシングルステップアウトするときやコンパイラ生成コードに気づく可能性が高くなります。 –

+0

@PeterCordesそれは役に立たなかったようです。そして、私はそれをやっていますが、arduinoのシリアルモニタとやりとりするために.inoファイルに複数の関数を書いているので、残念なことにこのようにしなければなりません。 - Arduino IDEのデバッグについては、あまり詳しく説明していないので、どうやってそれをどうやって進めるべきか正確には分かりません。 –

答えて

3

は答えにすべてのコメントを組み合わせる:

を私はARMについて多くを知らないが、a2は(thisにつき)r1のためだけに別の名前ではないのですか?もしそうなら、このように両方を使用しようとするのは悪い考えです。

Peterが言及したように、ここでは "cc"と同様に "memory" clobberを使用することがあります。

また、mov a3, %[N]は不要です。 %[N](既にレジスタです)を使用して自分自身をレジスタとして保存することができるようです。

最後に、gccのインラインasmを使用しない理由についての私の標準的なコメントはhereです。

+0

ああ、良い "cc" 'clobberが必要な点。それはx86に暗黙的なので忘れやすい。 –

関連する問題