2017-04-01 8 views
1

私の目標は、C言語を使ってソートアルゴリズムを実装することです。 ARMマシンでgcc -O0(最適化オプションなし)でコンパイルした場合、最小限の命令数に変換するCコードを作成する必要があります。 私の考えは、アセンブリで実装されたquicksortをCコードに直接埋め込むことです。 私は以下のいくつかの文書を参照し、私の目標を実装しようとしました。 しかし、私は組み込み関数 'QuickSort'にパラメータとしてintarrayを入れる方法を知らない。C言語でARMアセンブリを埋め込む

リファレンス 1. https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Quicksort#ARM_Assembly 2. http://forum.falinux.com/zbxe/index.php?mid=lecture_tip&comment_srl=517498&sort_index=readed_count&order_type=asc&l=fr&page=58&document_srl=567970(英語以外のウェブサイトのため申し訳ありません)

私は、アセンブリ内の初心者です。 あなたがgccでコンパイルしていることを述べているので

#include <stdio.h> 
#include <stdint.h> 
int Quicksort(uint32_t intarray[]); 

asm(
".global Quicksort\n\ 
Quicksort:\n\ 
qsort:\n\ 
    stmfd sp!,{r4, r6, lr}  \n\ 
    mov  r6,r2    \n\ 
qsort_tailcall_entry:\n\ 
    sub  r7,r6,r1\n\ 
    cmp  r7,#1\n\ 
    ldmlefd sp!,{r4,r6,pc}\n\ 
    ldr  r7,[r0,r1,asl#2]\n\ 
    add  r2,r1,#1\n\ 
    mov  r4,r6\n\ 
partition_loop:\n\ 
    ldr  r3,[r0, r2, asl #2]\n\ 
    cmp  r3,r7\n\ 
    addle r2,r2, #1\n\ 
    ble  partition_test\n\ 
    sub  r4,r4, #1\n\ 
    ldr  r5,[r0, r4, asl #2]\n\ 
    str  r5,[r0, r2, asl #2]\n\ 
    str  r3,[r0, r4, asl #2]\n\ 
partition_test:\n\ 
    cmp  r2,r4\n\ 
    blt  partition_loop\n\ 
partition_finish:\n\ 
    sub  r2,r2,#1\n\ 
    ldr  r3,[r0,r2,asl #2]\n\ 
    str  r3,[r0,r1,asl #2]\n\ 
    str  r7,[r0,r2,asl #2]\n\ 
    bl  qsort\n\ 
    mov  r1,r4\n\ 
    b  qsort_tailcall_entry\n\ 
" 
); 


int main(void){ 
    uint32_t intarray[10] = {5,2,5,1,7,5,7,2,3,8}; 
    Quicksort(intarray); 
    return 0; 
} 
+0

この[document](http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042f/IHI0042F_aapcs.pdf)をお読みください レジスタr0〜r3を使用して関数の引数。 セクション5.5をご覧ください – Gaurav

+0

この[リンク](http://stackoverflow.com/questions/16632752/matrix-multiplication-in-arm-assembly)が役立つ可能性があります。 – Motun

+0

'-O0'以外の最適化レベルを使用できないのはなぜですか? – fuz

答えて

0

は、あなたが(名前が言うように、それはgccの拡張だと他のコンパイラとの互換性がない場合があります)gccのasm拡張子を使用することができます。..私を助けてください。 basic asmextended asmを見てください。おそらくCコードからデータにアクセスするので、メモリオペランドを指定できる高度なバージョンを使用することをお勧めします。

+0

私はそれを試みます。どうもありがとうございました! – kcw

+0

別の問題を教えてもらえますか? http://stackoverflow.com/questions/43423872/embedding-arm-assembly-in-c-language-compile-error ありがとうございます。 – kcw

関連する問題