在visual studio的c語言開發中,呼叫彙編有幾點需要注意的地方
首先要區別masm和masm32,masm是已經整合在visual studio中的彙編器,即彙編使用的ml.exe,可直接使用對已有的彙編**進行彙編。masm32是一套彙編的sdk,其安裝和配置方法在sabalol的博文:
中已經說明較為詳細,可以參考。
sabalol的博文也給出了在visual studio中進行彙編配置的一些說明,在我的實踐中發現,實際使用中在鏈結器中設定相應需要include的目錄,使得彙編能夠找到引用的sdk的庫檔案,同時需要修改工程的生成自定義,勾選masm,使得visual studio可以呼叫masm彙編器。
在visual studio可以進行彙編之後,就涉及到在c語言中呼叫彙編函式的問題,在網上給出的很多例項均不能良好的執行,我也未深究其原因。
這一鏈結中給出的例項能夠良好的執行,可以作為入門學習的範例,再在此基礎上新增呼叫所需的介面或其他引數。
c語言部分為:
extern void clear();若使用c++編譯器,則宣告部分需要修改為:int main()
extern "c"
彙編部分**為:
.586 ;target processor. use instructions for pentium class machines.model flat, c ;use the flat memory model. use c calling conventions
.stack ;define a stack segment of 1kb (not required for this example)
.data ;create a near data segment. local variables are declared after
;this directive (not required for this example)
.code ;indicates the start of a code segment.
clear proc
xor eax, eax
xor ebx, ebx
ret
clear endp
end
關於intel彙編的學習發現乙個比較完整的博文系列
編寫中遇到的一些問題:
1. 訪問c語言全域性變數:
使用extrn來指定變數名為全域性變數,只宣告不定義
2. ptr的使用:
ptr主要有兩種用處,乙個是指定訪問儲存的大小,另乙個是指標定義
如:在將暫存器資訊寫入記憶體過程中指定大小 "movbyte ptr [pstate], bl"
在彙編函式需要傳入指標時:pstate:ptr byte
3. 彙編函式呼叫:
通過檢視反彙編**可以知道,在呼叫彙編函式時,直接使用call呼叫,問題在於沒有進行現場保護
而呼叫c語言函式時,則會進行現場保護。
需要手動進行壓棧操作保護現場以使得返回c語言函式後能夠正常執行
需要保護的暫存器詳見
4. 全域性資料的訪問:
全域性變數在編譯了之後是儲存在靜態儲存區的,在程式中已經分配好了位址
movzx ebx, byte ptr [offset ff_h264_cabac_tables+ebx]
的方式獲取全域性陣列中的值。
5. 彙編呼叫c語言函式
如第3點中所述,彙編呼叫函式需要進行手動壓棧等操作,當呼叫c語言函式時,需要進行宣告,
許多資料上寫的宣告是 extern function:model model表示當前函式模式(near,far等),
在vs中宣告為:
function proto c:type1,type2
6. 利用標誌暫存器的條件指令
可以利用標誌暫存器的狀態來有條件的執行指令,目前使用過cmovcc來依據條件轉移資料。
有關標誌暫存器參見:
有關彙編優化的帖子:
彙編與c語言混合程式設計教程:難開啟)
彙編呼叫c自定義程式的方法:
urey『s factory
Visual Studio 2012中編寫C程式
換了 win7 系統後,突然發現 vc 6.0 不相容了,我聽說有的同學的行,反正我是不行.那就用vs2012唄。我們來看看怎麼用 開啟檔案 新建 專案,新建乙個專案 選擇win32控制台 注意不要選錯,我在這栽了不少跟頭 在下面隨便輸入乙個檔案的名字就行,根本不用像網上說的要改什麼檔案的字尾,然後...
opencv在visual studio中配置
f program files opencv2.4.4 opencv build include f program files opencv2.4.4 opencv build include opencv f program files opencv2.4.4 opencv build incl...
Visual Studio中scanf s的使用
1.scanf在vs裡面已經棄用了,因為其對讀取輸入的空間沒有約束,容易造成記憶體越界的問題,建議使用scanf s代替。2.scanf s在讀取字串或字元輸入時需要在引數列表中新增長度約束,如 scanf s s stra,100 來限制其對記憶體的訪問 3.scanf s與scanf有同樣的輸入...