如何编写__asm__转到内联汇编

问题描述 投票:0回答:1

我正在使用 GCC 编译器。我想在C中插入一些内联指令。使用__asm__指令成功插入非分支指令,如下:

  __asm__ volatile (
            "add %[my_out], %[my_op1], %[my_op2]\n"
            : [my_out] "=&r" (array[3])
            : [my_op1] "r" (array[0]),[my_op2] "r" (array[1])
    );

但我无法插入分支/跳转指令。编译出现以下错误:

../test.c:5: error: expected '(' before 'goto'
../test.c:5: error: expected identifier or '*' before 'volatile'

我尝试了以下代码:

unsigned int array[10] = { 0x22, 0x12,0,0,0,0,0,0,0};
int main() {


  __asm__ goto volatile (
                "jp %l[label]\n"
                : /*no output*/
                : [my_op1] "r" (array[0]),[my_op2] "r" (array[1])
                : /*no cobblers*/
                : label
        );


  return 0;

label:

  __asm__ volatile (
                "add %[my_out], %[my_op1], %[my_op2]\n"
                : [my_out] "=&r" (array[3])
                : [my_op1] "r" (array[0]),[my_op2] "r" (array[1])
        );


  return 0;

}

您能帮忙纠正这个代码吗? 问候

gcc inline-assembly
1个回答
0
投票

您必须通过 asm 模板中的

%
来引用标签。 请注意,根据平台的不同,您需要添加 asm 操作数打印修饰符,例如在 AVR 上,您需要
%x

示例:

int func (void)
{
    __asm goto ("# use %0" "\n\t"
                "# use %1"
                :::: labl1, labl2);
    return 0;
labl1:
    return 1;
labl2:
    return 2;
}

当您想明确指定

volatile
时,您可以根据需要将其放置在
goto
之前或之后。

请注意,

asm goto
不能有输出操作数,因此所有
asm goto
都是隐式易失性的。

© www.soinside.com 2019 - 2024. All rights reserved.