在我不断尝试GCC内联汇编的过程中,遇到了一个关于标签和内联代码的新问题。
考虑以下简单跳转:
考虑以下简单跳转:
__asm__
(
"jmp out;"
"out:;"
:
:
);
这段代码除了跳转到out
标签外并没有做任何事情。虽然这段代码本身可以编译通过,但如果将其放在函数内,并使用优化标志进行编译,编译器会报错:"错误:符号'out'已经定义"。
看起来编译器每次内联函数时都会重复这个汇编代码。这导致标签out
被复制,从而产生多个out
标签。
那么我该如何解决这个问题呢?不能在内联汇编中使用标签吗?这篇GCC内联汇编教程提到:
因此,您可以将汇编代码放入CPP宏和内联C函数中,以便任何人都可以将其用作任何C函数/宏。内联函数非常类似于宏,但有时使用起来更加清晰。请注意,在所有这些情况下,代码将被复制,因此只应在该asm代码中定义局部标签(1:样式)。
我尝试查找有关这些“局部标签”的更多信息,但似乎找不到与内联汇编相关的内容。看起来这篇教程是说局部标签是一个数字后跟一个冒号(如1:
),因此我尝试使用这样的标签。有趣的是,代码编译通过了,但在运行时它只触发了一个段错误。嗯...
那么有什么建议、提示或答案吗?
Indeed
和jmp 1
都被视为跳转到位置 1,因此导致了段错误。 - greggo