You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:40:46