Assembly 不带内联程序集的标签

Assembly 不带内联程序集的标签,assembly,x86-64,gnu,intel-syntax,Assembly,X86 64,Gnu,Intel Syntax,我只是想写一些ASM代码并将其包含在C/C++代码中,不是通过内联模式,而是创建一个不同的ASM模块。我发现CodeBlocks项目允许ASM源代码,所以我遵循了下面的步骤,实际上做了一些轻微的更改,比如building命令: gcc -c myasmfile.s -o ./obj/Debug/myasmfile.o 除了标签,一切似乎都正常 以下是一个例子: .text .intel_syntax noprefix .globl mytest mytest: push rbp

我只是想写一些ASM代码并将其包含在C/C++代码中,不是通过内联模式,而是创建一个不同的ASM模块。我发现CodeBlocks项目允许ASM源代码,所以我遵循了下面的步骤,实际上做了一些轻微的更改,比如building命令:

gcc -c myasmfile.s -o ./obj/Debug/myasmfile.o
除了标签,一切似乎都正常

以下是一个例子:

.text
.intel_syntax noprefix
.globl mytest
mytest:
    push    rbp
    mov     rbp, rsp

    mov     rcx, 0

    .mylabel:
    inc     rcx
    cmp     rcx, 10
    jne      .mylabel

    mov     rax, rcx

    leave
    ret
当我尝试运行和调试该函数时,得到的结果如下:

这就像它将
mylabel
识别为一个新函数,在它之后剪切所有代码。我无法解释为什么它会两次显示相同的代码,但即使没有标签也会发生,所以我认为这与它们无关(无论如何,为什么会发生?)

然后,我阅读了讨论,并尝试了其中列出的所有可能的解决方案,但没有成功。以下是我尝试过的:

  • 向前和向后分别使用后缀
    f
    b

  • 对本地标签使用
    %=

  • 即使在标签声明中没有
    也尝试过

为什么标签在内联程序集中工作,而在我的例子中却不工作

编辑 多亏了@fuz,我的代码现在可以正常工作了。顺便说一下,在调试窗口中,函数被复制两次,尽管内存地址相同


您应该添加
-g
开关以生成调试信息。在标签声明中“Lcaol标签必须加前缀
.L
,而不仅仅是
。也可以使用编号标签。如果你愿意,我可以在回答中写下这一点。请注意,你提到的讨论是关于内联汇编的。你不写内联汇编,所以它不适用于你。@fuz我知道,但我希望找到答案。不管怎样,我把
.mylabel
改成了
.Lmylabel:
,它确实起作用了。非常感谢。在我的调试控制台中,同一个函数显示两次有什么原因吗?从模糊的互联网资源(如youtube视频)学习一门语言是个坏主意。并阅读您使用的工具的文档。binutils文档很容易理解。您应该添加
-g
开关以生成调试信息。在标签声明中“Lcaol标签必须加前缀
.L
,而不仅仅是
。也可以使用编号标签。如果你愿意,我可以在回答中写下这一点。请注意,你提到的讨论是关于内联汇编的。你不写内联汇编,所以它不适用于你。@fuz我知道,但我希望找到答案。不管怎样,我把
.mylabel
改成了
.Lmylabel:
,它确实起作用了。非常感谢。在我的调试控制台中,同一个函数显示两次有什么原因吗?从模糊的互联网资源(如youtube视频)学习一门语言是个坏主意。并阅读您使用的工具的文档。binutils文档易于理解。