1
저는 Cortex-m3에서 실행되는 프로그램을 작성하고 있습니다."svc"에 대한 gcc 컴파일러 프리미티브가 있습니까?
처음에는 'svc'를 실행하는 어셈블리 파일을 작성했습니다.
svc:
svc 0
bx lr
나는 GCC의 인라인 어셈블리를 사용하기로 결정, 그래서 다음과 같이 내가 쓴하지만
svc
함수는 인라인되지 않았습니다.
__attribute__((naked))
int svc(int no, ...)
{
(void)no;
asm("svc 0\n\tbx lr");
}
int f() {
return svc(0,1,2);
}
------------------ generated assembly ------------------
svc:
svc 0
bx lr
f:
mov r0, #0
mov r1, #1
mov r2, #2
b svc
나는 그것이 naked
때문에이 인라인하지, 그래서 나는 naked
속성을 떨어 같이 쓴 것 같아요.
int svc(int __no, ...)
{
register int no asm("r0") = __no;
register int ret asm("r0");
asm("svc 0" : "=r"(ret) : "r"(no));
return ret;
}
------------------ generated assembly ------------------
svc:
stmfd sp!, {r0, r1, r2, r3}
ldr r0, [sp]
add sp, sp, #16
svc 0
bx lr
f:
mov r0, #0 // missing instructions setting r1 and r2
svc 0
bx lr
GCC는 불필요한 스택 연산을 추가하는 이유는 알 수 없지만
,svc
이 좋다. 문제는
svc
이 올바로 인라인되지 않았으며 가변 매개 변수가 삭제되었습니다.
svc
프리미티브가 gcc에 있습니까? gcc에없는 경우 gcc에 올바른 것을 쓰려면 어떻게해야합니까?
인라인 함수는 "inline"함수를 표시하지 않았으므로 헤더 파일에 선언되어야합니다 (구현시 컴파일시 사용 가능해야 함). – IdeaHat
@MadScienceDreams 둘 다 동일한 컴파일 단위에 정의되었습니다. 그렇지 않은 경우에도 링크 시간 최적화가 사용되면 인라인 될 수 있습니다. 'inline' 키워드는 여기에있는 해결책이 아닙니다. – kukyakya
어셈블리 언어 함수를 작성하고 컴파일러 관련 인라인 함수를 처리하는 것보다 어셈블 및 링크하는 것이 훨씬 쉽습니다. svc는 즉각적인 인수를 취하므로 자기 수정 코드를 사용하지 않는 한 인수를 전달하지 않고 SVC를 즉시 사용할 수 있습니다. –