Assembly 不带内联程序集的标签
我只是想写一些ASM代码并将其包含在C/C++代码中,不是通过内联模式,而是创建一个不同的ASM模块。我发现CodeBlocks项目允许ASM源代码,所以我遵循了下面的步骤,实际上做了一些轻微的更改,比如building命令: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
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
- 对本地标签使用
%=
- 即使在标签声明中没有
也尝试过
您应该添加
-g
开关以生成调试信息。在标签声明中“Lcaol标签必须加前缀.L
,而不仅仅是
。也可以使用编号标签。如果你愿意,我可以在回答中写下这一点。请注意,你提到的讨论是关于内联汇编的。你不写内联汇编,所以它不适用于你。@fuz我知道,但我希望找到答案。不管怎样,我把.mylabel
改成了.Lmylabel:
,它确实起作用了。非常感谢。在我的调试控制台中,同一个函数显示两次有什么原因吗?从模糊的互联网资源(如youtube视频)学习一门语言是个坏主意。并阅读您使用的工具的文档。binutils文档很容易理解。您应该添加-g
开关以生成调试信息。在标签声明中“Lcaol标签必须加前缀.L
,而不仅仅是
。也可以使用编号标签。如果你愿意,我可以在回答中写下这一点。请注意,你提到的讨论是关于内联汇编的。你不写内联汇编,所以它不适用于你。@fuz我知道,但我希望找到答案。不管怎样,我把.mylabel
改成了.Lmylabel:
,它确实起作用了。非常感谢。在我的调试控制台中,同一个函数显示两次有什么原因吗?从模糊的互联网资源(如youtube视频)学习一门语言是个坏主意。并阅读您使用的工具的文档。binutils文档易于理解。