목표는 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;
}
이 [document] (http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042f/IHI0042F_aapcs.pdf)을 읽어주십시오. r0부터 r3까지의 레지스터를 사용해야합니다. 함수 인수. 섹션 5.5를보십시오 – Gaurav
이 [link] (http://stackoverflow.com/questions/16632752/matrix-multiplication-in-arm-assembly)가 도움이 될 수 있습니다. – Motun
왜 '-O0' 이외의 최적화 수준을 사용할 수 없습니까? – fuz