【问题标题】:Assembly language parse error before '[' token'[' 标记之前的汇编语言解析错误
【发布时间】:2014-05-18 22:15:06
【问题描述】:

我在第 24 行收到一个解析错误(我相信)“'[' token 之前的解析错误”

另外,如果你们中的任何人想给我一些有用的提示和对我的项目的见解,我将非常感激。我正在构建一个 pow 函数,所有计算都在 asm 中完成,这段代码是将 FPU 更改为舍入为 0,以便我可以将指数分成 2 部分(例如:2^3.2 = 2^3 * 2 ^0.2)

#include <stdio.h>
#include <stdlib.h>

#define PRECISION           3
#define RND_CTL_BIT_SHIFT   10

// floating point rounding modes: IA-32 Manual, Vol. 1, p. 4-20
typedef enum {
    ROUND_TOWARD_ZERO =     3 << RND_CTL_BIT_SHIFT
} RoundingMode;

int main(int argc, char **argv)
{

        int fpMask      = 0x1F9FF;
        int localVar    = 0x00000;

        asm("           FSTCW           %[localVarIn]                   \n" // store FPU control word into localVar
            "           add             %[localVarIn], %[fpMaskOut]     \n" // add fpMaskIn to localVar

        :   [localVarOut]   "=m"    (localVar)
        :   [fpMaskOut]     "=m"    (fpMask)

        :   [localVarIn]    "m"     (localVar)
        :   [fpMaskIn]      "m"     (localVar)
    );

    printf("FPU is 0x%08X\n\n", localVar);

return 0;

}

【问题讨论】:

  • 我在 Cygwin 中使用 gcc。对不起。

标签: c gcc assembly inline-assembly parse-error


【解决方案1】:

我相信你的破坏者名单有点错误。在 GCC 中,它们采用以下形式:

asm("MY ASM CODE" : output0, output1, outputn 
                  : input0, input1, inputn 
                  : clobber0, clobber1, clobbern);

请注意,每个 class 用冒号分隔(即输出的 set、输入的 set 等),然后是其中的每个元素一个集合是逗号分隔的。因此,请尝试将您的 ASM 更改为以下内容:

asm("           FSTCW           %[localVarIn]                   \n" // store FPU control word into localVar
    "           add             %[localVarIn], %[fpMaskOut]     \n" // add fpMaskIn to localVar

    :   [localVarOut]   "=m"    (localVar),         // Outputs...
        [fpMaskOut]     "=m"    (fpMask)

    :   [localVarIn]    "m"     (localVar),         // Inputs...
        [fpMaskIn]      "m"     (localVar)

【讨论】:

  • 这解决了这个问题(但是你瞧,当 1 被斩首时,2 会在它的位置生长 :))
  • 是的,我的 x86 asm 技能基本上是不存在的,所以我无法进一步帮助您:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多