2017-04-01 68 views
2

试图实现一个基本的操作系统,但是该ASM东西与我的头搞乱我使用vs2015内联汇编器给出C2400在VS 2015年

给出错误代码

inline cpu_flags DisableInterrupts() 

{ 
cpu_flags fl; 


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


return fl; 
} 

提示错误像这样

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

后除去挥发也没有运气

inline cpu_flags DisableInterrupts() 
{ 



cpu_flags fl; 


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


return fl;` 
} 

它给

错误C2400嵌入式汇编语法错误在“操作码”;发现“(”

谢谢

回答

0

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

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

但是,您说您正在尝试将它与Microsoft制作的Visual Studio配合使用。 Visual Studio使用一种非常不同的内联asm语法而不是gcc。

我不会试着教你关于Visual Studio的内联asm的一切。请参阅他们的docs

+0

谢谢你,我正在研究我的代码的视觉工作室版本,这个链接对我有帮助。 – sakura

1

这是AT GCC使用& T语法。

Visual Studio中使用英特尔的语法的内联汇编。但是,也有一个内置的_disable()功能没有按”牛逼需要任何汇编代码

还没有关于限制使用这个功能的话:

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

+0

ok,你说的语法是什么有办法将它改变为intel语法,这样我的视觉工作室就可以理解 – sakura

+0

嗯,是的,它只是'__asm cli',但没有优于_disable() '。 –

+0

ok._disable()工作得很好,但它没有任何参数,所以如何处理其他代码,如push和pop。 – sakura