visual studio中C語言呼叫彙編

2021-08-27 16:46:22 字數 2131 閱讀 9975

在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();

int main()

若使用c++編譯器,則宣告部分需要修改為:

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有同樣的輸入...