我正在为AVR编写一个RPC库,并且需要将函数地址传递给某些内联汇编程序代码,并从汇编程序代码中调用该函数。但是,当我尝试直接调用该函数时,汇编程序抱怨。传递给gcc内联汇编程序的调用const函数地址(avr-gcc)
这个小例子说明TEST.CPP问题(在我传递ARGS的实际情况和功能模板类的静态成员的一个实例):
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的”,它指的是该文件是test.S,其中包含该线路38上:
call gs(_Z3barv)
我试图在参数设置为内联汇编,我能找到here所有甚至远程明智的约束,但是没有那些我试过的工作。
我想象如果gs()部分被删除,一切都应该工作,但所有的约束似乎添加它。我不知道它做了什么。
奇怪的是,做这样一个间接调用组装就好了:
void bar() {
return;
}
void foo() {
asm volatile (
"ldi r30, lo8(%0)" "\n"
"ldi r31, hi8(%0)" "\n"
"icall" "\n"
:
: "p" (bar)
);
}
汇编器生成这个样子的:
ldi r30, lo8(gs(_Z3barv))
ldi r31, hi8(gs(_Z3barv))
icall
而且AVR-如不抱怨任何垃圾。