gpt4 book ai didi

c - m68k-elf 目标是否支持 GCC 内联 asm goto?

转载 作者:行者123 更新时间:2023-12-04 07:31:08 26 4
gpt4 key购买 nike

我正在开发一个项目,其中有很多围绕 M68000 asm 调用的 C 包装器。其中一些调用会在条件代码寄存器上返回成功/失败状态,因此根据 CC 的状态“转到”一个 C 标签是理想的。但是,无论我尝试什么样的排列,我都会不断收到来自编译器的语法错误。
(这是 gcc 10.2.0 --with-cpu=m68000)
示例代码:

  asm(R"(
moveq #0, d1
jsr %p0
bcc %l0
2:
)":
:
"i"(_BURAM),
"d"(d0_fcode),
"a"(a0_info),
"a"(a1_data)
:
"cc"
: failed);

return true;

failed:
return false;
这产生的错误是:
/home/ryou/Projects/megadev/lib/sub/bram.h: In function 'bram_brmwrite':
/home/ryou/Projects/megadev/lib/sub/bram.h:156:7: error: expected ')' before ':' token
156 | "cc"
| ^
| )
157 | : failed);
| ~
/home/ryou/Projects/megadev/lib/sub/bram.h:144:5: note: to match this '('
144 | asm(R"(
| ^
我尝试使用最简单的示例来进行测试:
asm("bra %l0" :::: failed);
我仍然得到:
/home/ryou/Projects/megadev/lib/sub/bram.h:144:18: error: expected ')' before '::' token
144 | asm("bra %l0" :::: failed);
我在这里找到的唯一其他有点相关的信息是:
Extended asm with goto, including an example from the gcc docs, fails to compile
但是,正如您在两个示例中所看到的,我没有使用任何输出。我认为 m68k-elf 目标不特别支持这一点,但我真的不明白为什么它不会,而且我还没有找到任何文档说那么多。
有很多方法可以解决这个问题(即通过检查 asm 片段本身内的 CC 状态并将状态推送到输出寄存器),但如果可能的话,我想使用 goto 标签。任何解决此问题的帮助将不胜感激。

最佳答案

是的,它受支持。我认为问题在于您的代码,它有几个错误:

  • 要使用 goto 功能,您需要使用 asm goto 开始内联汇编语句。关键词。您错过了 goto .
  • 标签操作数在输入操作数之后按顺序编号(当然不能有输出)。所以failed是操作数 4,因此您需要使用 bcc %l4 来引用它,不是 %l0 .

  • 通过这些更改,我可以编译代码。

    顺便说一下,我对 m68k 汇编不太了解,但看起来你在破坏寄存器 d1 ,以及任何 _BURAM子程序 clobbers,但那些还没有被声明为 clobbers。你不应该加 "d1"其余的还有 "cc" ?
    此外,似乎您正在期待操作数 d0_fcode , a0_info等,放在那些特定的寄存器中,大概是因为 _BURAM期待他们在那里。您是否定义了这些变量 register asm 告诉编译器,例如 register int d0_fcode asm("d0"); ?否则它可以例如选择 d4d0_fcode操作数。在我的测试中,它们偶然被放入所需的寄存器中,而没有明确询问,但这并不安全。

    关于c - m68k-elf 目标是否支持 GCC 内联 asm goto?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67923847/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com