怎麼把彙編代碼自動轉換成C語言內聯彙編?


用 gcc/g++ -S -o- 可輸出彙編代碼,把彙編代碼轉換成C字元串,寫成像下面這樣的一行就可以了

asm("asm code here");

可是在某些OJ提交,在棧上分配個大點的數組,就可能會出錯,不知道是不是因為gcc版本太老的不兼容本地編譯出來的彙編代碼?

----------------------------------------------------

Update:

根據StackOverflow上問題c++ - What is the purpose of the _chkstk() function?的回答,在Windows上,要是一個函數內分配的局部變數佔用內存超過一頁,得調用一下chkstk,否則直接就被幹掉了。

我懷疑老版本gcc可能chkstk的名字不太一樣。不管這個,直接複製個最新版的得了

mingw-w64/dll_dependency.S at cf136d93e41ffff7f593230e20c5854a68322b5d · mirror/mingw-w64 · GitHub

這樣提交就能成功了

----------------------------------------------------

最後感謝一下 @宋方睿 提供的思路


不知題主要的是這種內聯嗎?


為什麼不直接用asm文件寫彙編函數?在C/C++裡面內嵌彙編很容易出問題的。


msvc做不到。用了彙編就別想內聯

gcc可以。

但要注意gcc的分支優化實在很蛋疼,不一定有你要的效果,不過你可以用gcc5.x的版本試試運氣。

gcc就是典型Linux派/開源派做法,我覺得A比B好用,我就給你用上A了

當gcc判斷的A確實比B好時,用戶受益

當gcc判斷的A實際不如B時,用戶不論寫成A還是寫成B,都會被轉成A,呵呵

而MSVC至少如果特需A,可以寫成A。

clang沒研究過。


逆向么?用IDA pro試試


自動的話貌似有收費的反編譯工具,手工的話可以參考這個:

GCC-Inline-Assembly-HOWTO


推薦閱讀:

如何在win8 64位上裝turbo C2.0和VisualC++6.0?
數組和指針的一個問題?
C/C++ 的語法是 LL(1) 語法嗎?
請問:".h"頭文件是用什麼語言編寫的?

TAG:C編程語言 | 彙編語言 | GCC |