AVR 용 RPC 라이브러리를 작성 중이며 일부 인라인 어셈블러 코드에 함수 주소를 전달하고 어셈블러 코드 내에서 함수를 호출해야합니다. 그러나 어셈블러는 함수를 직접 호출하려고 할 때 불평합니다.gcc 인라인 어셈블러 (avr-gcc)에 전달 된 const 함수 주소 주소
이 최소한의 예 Test.cpp에 (나는 인수를 전달하고있어 실제 경우와 함수는 템플릿 클래스의 정적 멤버의 실체화) 문제를 보여
void bar() {
return;
}
void foo() {
asm volatile (
"call %0" "\n"
:
: "p" (bar)
);
}
가 avr-gcc -S test.cpp -o test.S -mmcu=atmega328p
로 컴파일하는 것은 잘 작동 내가 함께 조립하려고 할 때하지만 불평 avr-gcc -c test.S -o test.o -mmcu=atmega328p
AVR-같이
test.c: Assembler messages:
test.c:38: Error: garbage at end of line
나는 그것이 "TEST.C"가 참조되는 파일 라인 (38)에 포함되어 test.S이다를 기록 왜 아무 생각이 없다 :
012 3,516,call gs(_Z3barv)
내가 here을 찾을 수있는 인라인 어셈블러에 있었던 파라미터의 모든 심지어 원격으로 합리적인 제약을 시도했지만 나는 시도 그 중 어느 것도 작동하지 않습니다.
gs() 부분이 제거 되었으면 모든 것이 작동하지만 모든 제약 조건이이를 추가하는 것 같습니다. 나는 그것이 무엇을하는지 전혀 모른다.
ldi r30, lo8(gs(_Z3barv))
ldi r31, hi8(gs(_Z3barv))
icall
그리고 어떤 불평하지 않는 AVR-같이
void bar() {
return;
}
void foo() {
asm volatile (
"ldi r30, lo8(%0)" "\n"
"ldi r31, hi8(%0)" "\n"
"icall" "\n"
:
: "p" (bar)
);
}
어셈블러는이 같은 모습을 만들어 :
이상한 것은이 같은 간접 호출을 수행하는 것은 잘 조립이다 찌꺼기.