相关疑难解决方法(0)

GCC内联汇编中的标签

在我正在进行的GCC内联汇编实验中,我遇到了一个关于标签和内联代码的新问题.

考虑以下简单的跳转:

__asm__
(
    "jmp out;"
    "out:;"
    :
    :
);
Run Code Online (Sandbox Code Playgroud)

除了跳转到out标签外,这没有任何作用.这样,这段代码编译得很好.但是如果你把它放在一个函数中,然后用优化标志进行编译,编译器就会抱怨:"错误:符号'out'已经被定义了".

似乎正在发生的事情是编译器每次内联函数时都会重复此汇编代码.这会导致标签out重复,从而导致多个out标签.

那么,我该如何解决这个问题呢?在内联装配中是否真的不可能使用标签?关于GCC内联汇编的教程提到:

因此,您可以将汇编放入CPP宏和内联C函数中,因此任何人都可以将其用作任何C函数/宏.内联函数非常类似于宏,但有时使用起来更干净.请注意,在所有这些情况下,代码将被复制,因此只应在该asm代码中定义本地标签(1:样式).

我试图找到有关这些"本地标签"的更多信息,但似乎无法找到与内联汇编有关的任何内容.看起来教程是说本地标签是一个数字后面跟冒号(比如1:),所以我尝试使用这样的标签.有趣的是,代码已编译,但在运行时它只是触发了分段错误.嗯...

那么任何建议,提示,答案......?

c c++ assembly gcc inline-assembly

38
推荐指数
2
解决办法
3万
查看次数

为什么不能在多个函数中定义相同的本地标签?

要在多个函数中定义相同的本地标签:

    .text
    .globl main
func:
    push %rbp
    mov %rsp, %rbp
.a:
    leave
    ret

main:
    push %rbp
    mov %rsp, %rbp
.a:
    leave
    ret
Run Code Online (Sandbox Code Playgroud)

奇怪地得到错误:

$ clang -c main.s
main.s:13:1: error: invalid symbol redefinition
.a:
^
Run Code Online (Sandbox Code Playgroud)

当我使用yasm时,它允许多个功能使用相同的本地标签。你有什么线索吗?

syntax assembly x86-64 gnu-assembler

2
推荐指数
1
解决办法
786
查看次数

标签 统计

assembly ×2

c ×1

c++ ×1

gcc ×1

gnu-assembler ×1

inline-assembly ×1

syntax ×1

x86-64 ×1