【问题标题】:inline assembler in gives c2400 in vs 2015内联汇编器在与 2015 中给出 c2400
【发布时间】:2017-08-26 16:43:57
【问题描述】:

尝试实现一个基本的操作系统,但是我正在使用 vs2015 这个 asm 的东西让我头疼

给出错误的代码

inline cpu_flags DisableInterrupts()

{
cpu_flags fl;


_asm volatile ("pushfl; popl %0; cli" : "=g" (fl));


return fl;
}

它给出了这样的错误

“操作码”中的错误 C2400 内联汇编程序语法错误;找到“数据类型”

去除 volatile 后也没有运气

inline cpu_flags DisableInterrupts()
 {



 cpu_flags fl;


_asm ("pushfl; popl %0; cli" : "=g" (fl));


return fl;`
}

它给了

“操作码”中的错误 C2400 内联汇编程序语法错误;找到'('

谢谢

【问题讨论】:

    标签: c++


    【解决方案1】:

    这是 gcc 使用的 AT&T 语法。

    Visual Studio 对其内联汇编器使用 Intel 语法。但是,还有一个内置的 _disable() 函数,不需要任何汇编代码。

    也不是关于此功能使用受限的备注:

    此功能仅在内核模式下可用。如果在用户模式下使用,则会在运行时引发特权指令异常。

    【讨论】:

    • 好的,你说的语法怎么样,有办法把它改成intel语法,这样我的visual studio就可以理解
    • 嗯,是的,它只是__asm cli,但与_disable()相比没有优势。
    • ok._disable() 工作得很好,但它不接受任何参数,所以如何处理其余的代码,如 push 和 pop。
    【解决方案2】:

    世界上有许多不同的编译器,它们的工作方式都略有不同。

    您在问题中使用的语法来自 gnu 制作的gcc

    但是,您说您正在尝试将它与 Microsoft 制造的 Visual Studio 一起使用。 Visual Studio 对内联 asm 使用的语法与 gcc 完全不同。

    我不会尝试教您有关 Visual Studio 内联汇编的所有内容。见他们的docs

    【讨论】:

    • 谢谢伙计,我正在开发我的代码的 Visual Studio 版本,该链接对我有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 2013-07-23
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    相关资源
    最近更新 更多