【问题标题】:GCC inline assembly errorGCC 内联汇编错误
【发布时间】:2016-11-18 19:46:03
【问题描述】:

我正在尝试在 Linux 中使用 nano 文本文件转换内联汇编代码。

__asm__ ("MOV AX, morales1\n\t" 
         "MOV BX, morales2\n\t;"
         "ADD AX, BX\n\t;"
         "MOV morales, AX;" 
        );

士气 1 和 2 是签名短裤。我收到以下错误:

“错误:需要 ARM 寄存器 -- mov AX,morales1'”`

【问题讨论】:

  • 您在研究 ARM 芯片吗?您需要提供有效寄存器名称的芯片架构文档。 AX 可能不适用于给定的目标架构。你可以从这里开始:infocenter.arm.com/help/topic/com.arm.doc.qrc0001m/…
  • ARM 处理器需要 ARM 汇编代码,而不是 x86 汇编代码。
  • 是的,我是。我正在使用树莓派。所以格式不正确?喜欢寄存器?
  • 我从 C 中的内联汇编代码中复制并粘贴,并尝试将其转移到 Linux 中的 Kano 文本编辑器中。代码的 c 部分通过,但我只是在内联汇编中遇到错误

标签: inline-assembly


【解决方案1】:

您似乎对编译器的功能有些模糊。最简单的情况是,c 编译器获取带有 c 指令的文件,并将它们转换为适合在特定处理器上执行的汇编语言指令。

但是那里有很多处理器,每个处理器系列都使用不同的汇编指令。 c 编译器如何应对这种情况?答案是给定的编译器(通常)只支持一种输出格式。因此,您可能有一个编译器为 x86 输出代码,另一个输出 x64,一个为 ARM、MIPS 等。虽然它们都采用 c 语言输入文件,但它们每个都为其目标输出适当的汇编指令。

这意味着编译器可以将常规 c 指令(case、break、printf、scanf 等)转换为适合您的汇编程序。但是,当您使用 asm 指令时,您是在告诉编译器不要执行任何 c->assembler 翻译。它必须准确地输出您提供的特定汇编指令。

这一切与你的问题有什么关系?

如果您从一个平台(例如 x86)获取汇编指令并尝试在另一个平台(例如 ARM)上使用它,您认为会发生什么?好吧,大多数情况下发生的是它不起作用。 (作为一个虚构的例子)如果你尝试使用add x, y 而处理器期望u32.xadd x, x, y,它会变得非常混乱,并且把你的汇编器当作废话。

那么,你如何“解决”这个问题?好吧,最明智的计划是停止尝试在您的 c 代码中使用汇编语言。看起来您只是想添加 2 个数字。 c 已经有指令可以做到这一点。

强调:编写 c 代码并让编译器输出代码几乎总是更好的方法。尝试使用内联汇编要求您了解 c 语言、目标处理器的汇编语言以及您的特定编译器选择使用的两者之间的接口规则(每个编译器的执行方式似乎略有不同)。有很多东西要知道并尝试做对。而且(正如您所发现的)它使从一个编译器/处理器迁移到另一个痛苦。

但如果您绝对必须使用汇编程序,则需要从学习处理器的汇编程序指令开始。谷歌搜索应该为这些说明提供各种资源。一旦您了解了这一点,您就可以更新您的 asm 命令以包含正确的说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 2010-11-24
    • 2018-06-19
    • 1970-01-01
    • 2011-09-07
    • 2010-10-23
    • 2011-04-23
    相关资源
    最近更新 更多