Error: cannot represent SWI relocation in this object file format
Posted on 2011-12-07 22:33 nagisa 阅读(911) 评论(0) 收藏 举报最近在学习ARM,教程都是在ADS环境下开发的,而我用的是Ubuntu,需要将arm标准汇编改为GNU汇编,遇到了不少问题。
#define __led_on_swi_no 1 // 软中断号1,调用管理模式下的do_led_on函数
int led_on(int led_no){
int ret; // 返回值
__asm // 由于C程序中没有SWI对应表达式,所以使用混合编程
(
"mov r0, %[led_no]\n\t" // 根据ATPCS规则,r0存放第一个参数
"swi __led_on_swi_no\n\t" // 产生SWI软中断,中断号为__led_on_swi_no
"mov %[ret], r0\n\t" // 软中断处理结束,取得中断处理返回值,传递给ret变量
:[led_no]"=r" (led_no)
:[ret]"r" (ret)
);
return ret; // 将ret返回给调用led_on的语句
}
编译时发生错误:
/tmp/ccOYLmLf.s: Assembler messages:
/tmp/ccOYLmLf.s:42: Error: cannot represent SWI relocation in this object file format
google之:原因在于arm的软中断指令swi只能带立即数,将swi __led_on_swi_no改为swi 1,编译成功。问题:如何在内嵌汇编中调用宏定义?没有搜到答案
单步调试,发现R0寄存器的值不对,去掉"mov r0, %[led_no]“后正常。猜测GNU汇编自动将传过来的第一个参数放在了R0中?
浙公网安备 33010602011771号