2017-04-01 83 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(對不起,非英語網站)

我在組裝新手。 請幫助我..

#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

請閱讀此[文檔](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擴展名(如名字說,這是一個GCC擴展,可能與其他編譯器兼容)。看看basic asmextended asm。既然你可能會從你的C代碼中訪問數據,我建議你堅持使用高級版本來指定內存操作數。

+0

我會試試看。非常感謝你! – kcw

+0

你能幫我解決另一個問題嗎? http://stackoverflow.com/questions/43423872/embedding-arm-assembly-in-c-language-compile-error 謝謝。 – kcw