1

我只是想编写一些 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为一个新功能,将其后的所有代码都删掉了。我无法解释为什么它两次显示相同的代码,但即使没有标签也会发生,所以我认为它与它们无关(无论如何,为什么会发生这种情况?)。

然后我阅读了这个讨论,并尝试了那里列出的所有可能的解决方案,但没有成功。这是我尝试过的:

  • 分别使用后缀fb表示前进和后退。

  • 用于%=本地标签

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

为什么标签在内联汇编中起作用,而在我的情况下却不起作用?

编辑 感谢@fuz,现在我的代码正在运行。顺便说一句,尽管内存地址相同,但在调试窗口内,该函数被复制了两次。

调试截图(工作)

4

0 回答 0