C汇编中“undefined named operand”错误求助及修复咨询
问题
我尝试用汇编编写如下函数:
void asm_loop ( int n ){ register int *p1 asm ("r2") = &n; asm goto ( " cmp r2 , #0 \n\t" // Compare n to "0" " beq %l[ stop]" // Abort if n=0 : : [ num_repeats ] "r" ( p1 ) : :stop); stop: return ; }
但编译时出现错误:
error: undefined named operand ' stop '
我的GCC版本高于4.5,支持asm goto语法,对照官方文档示例写法也没看出问题,不明白为什么标签stop会被提示未定义。
解决方案
错误根源在于汇编语句里的标签引用语法:你写了%l[ stop],方括号内的stop前面多了一个空格,导致编译器把 stop(带前导空格)当成了一个命名操作数,但你在asm goto的标签列表里声明的是stop(无空格),两者不匹配,所以报错。
修复后的代码如下:
void asm_loop ( int n ){ register int *p1 asm ("r2") = &n; asm goto ( " cmp r2 , #0 \n\t" // Compare n to "0" " beq %l[stop]" // 去掉方括号内stop前面的空格 : : [ num_repeats ] "r" ( p1 ) : :stop); stop: return ; }
另外补充两个优化点:
- 既然你已经把
p1强制绑定到r2寄存器,其实可以省略输入操作数的声明,直接在汇编里使用r2即可; - 对比的是
n的值,你现在用的是指针p1指向n,其实可以直接把n作为操作数,不需要取地址,简化代码:
void asm_loop (int n) { asm goto ( "cmp %[num], #0\n\t" "beq %l[stop]" : : [num] "r" (n) : : stop ); stop: return; }
内容的提问来源于stack exchange,提问作者electronickid
相关产品推荐
相关产品推荐

