2017-04-01 66 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