我只是想编写一些 ASM 代码并将其包含在 C/C++ 代码中,而不是通过内联模式,而是创建一个不同的 ASM 模块。我发现 CodeBlocks 项目允许 ASM 源,所以我遵循了这些步骤,实际上有一些细微的变化,比如构建命令:
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,现在我的代码正在运行。顺便说一句,尽管内存地址相同,但在调试窗口内,该函数被复制了两次。