2017-04-01 30 views
1

목표는 C 언어를 사용하여 정렬 알고리즘을 구현하는 것입니다. ARM 기계에서 gcc -O0 (최적화 옵션 없음)으로 컴파일 할 때 최소한의 명령어 수로 변환하는 C 코드를 만들어야합니다. 내 생각은 어셈블리에 구현 된 quicksort를 C 코드에 직접 포함시키는 것입니다. 다음 여러 문서를 참조하고 목표를 달성하려고 시도했습니다. 그러나 intarray를 어셈블리 함수 'QuickSort'에 매개 변수로 넣는 방법을 모르겠습니다.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

이 [link] (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