對於內聯asm代碼,我使用vC++編譯器的__asm
和用於linux下gcc的__asm__()
或asm()
構造。 (英特爾/在& t語法相應)多線程支持Inline Asm(x86)
有沒有辦法來聲明內置程序集(x86)在C中爲他們都以通用的方式嗎?
P.S.用於合併兩者的自動化工具也是可以接受的。
對於內聯asm代碼,我使用vC++編譯器的__asm
和用於linux下gcc的__asm__()
或asm()
構造。 (英特爾/在& t語法相應)多線程支持Inline Asm(x86)
有沒有辦法來聲明內置程序集(x86)在C中爲他們都以通用的方式嗎?
P.S.用於合併兩者的自動化工具也是可以接受的。
將程序集放入宏中,並使用預處理器生成正確的代碼。
#ifdef GCC
#define MY_ASM_CODE __asm() { blah blah blah}
#endif
#ifdef MSVC
#define MY_ASM_CODE __asm { blah blah blah }
#endif
int main(void)
{
MY_ASM_CODE;
return 0;
}
你不是這個意思:'#define MY_ASM_CODE __asm'和'#define MY_ASM_CODE __asm()'?所以你可以輸入:'MY_ASM_CODE {asm code here}' - 雖然我從來沒有使用asm代碼,所以我可能是錯的... – Rookie
@Rookie - 不,對於不同的編譯器,asm代碼本身的格式也不同。因爲它是針對不同的處理器和不同的模式(32/64位)。有*是*在C編寫代碼的原因:-) –
謝謝。雖然,我所尋找的並不是一個平靜的東西 - 而是一個統一的方式來做同樣的「罷工」,你基本上建議我分別寫兩個內聯,這是我的觀點。 – dalimama
作爲替代...
我想你使用Visual C,因爲它是一個Windows平臺?
爲什麼不在Windows和Linux平臺上使用gcc?
然後它是相同的源和相同的彙編格式!
源文件中的彙編程序一直是編譯器特定的擴展。 –
簡單的答案是否定的。解決方案是將彙編代碼放入一個宏中,併爲每個平臺#ifdef。 – Neil
此時,使用YASM並單獨鏈接asm代碼變得更容易。它不會內聯,但它可以與GCC,MSVC和其他工作。 – harold