我的目標是使用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;
}
請閱讀此[文檔](http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042f/IHI0042F_aapcs.pdf) 我想你需要使用寄存器r0到r3來存儲函數參數。 請參閱第5.5節 – Gaurav
此[鏈接](http://stackoverflow.com/questions/16632752/matrix-multiplication-in-arm-assembly)可能有所幫助。 – Motun
爲什麼不能使用「-O0」以外的優化級別? – fuz