X64下VC工程內聯彙編

2021-06-19 14:01:33 字數 766 閱讀 4216

問題: 在x64 release下出現乙個奇怪的bug,**優化後乙個浮點乘法運算出錯了,例如1.0 × 1000 居然為 0。

分析:反彙編跟蹤發現原來是暫存器的值傳入有問題,本該傳1000.0,結果傳的是0.0。所用暫存器是xmm12,為什麼會出現這個問題呢,發現是因為前面呼叫了

libmpeg2的函式修改了xmm暫存器的值。根據windows x64呼叫約定,函式呼叫在使用xmm6-xmm15暫存器之前/之後,要儲存/恢復xmm暫存器。

libmpeg2庫已經不更新了,所以只能在呼叫庫函式之前和之後處理xmm暫存器的儲存和恢復。

方案:x64已經不支援直接的內聯彙編了,只能通過寫彙編檔案的方式來實現函式呼叫了。

首先,需寫乙個彙編檔案,裡面包括兩個函式,乙個是儲存xmm暫存器,另乙個是恢復xmm暫存器,引數傳遞是通過rcx,這個可以參考呼叫約定。

然後,設定工程,需先右鍵該工程,選擇「生成自定義」選項,在彈出的對話方塊中選擇編譯器,如下圖所以,此處使用的是yasm編譯器

最後,新增該asm檔案到工程中,右鍵該asm檔案,在彈出的對話方塊中簡單配置下,如下圖所示

用extern宣告asm中函式,在原始檔中呼叫即可。

注意c語言中不能在函式中間定義變數。

x64呼叫約定參考:

x64內聯彙編

建立 asm,寫入測試彙編 code asmadd proc mov rax,rcx add rax,rdx retasmadd endp end整形引數順序 rcx,rdx,r8,r9,rsp 浮點引數順序 xmm1,xmm2,xmm3.混合引數順序 第乙個引數整形 rcx,第二個引數浮點 xmm...

X64平台C C 與彙編混編工程搭建說明

2.2.1.1.step1 2.2.1.2.step2 2.2.1.3.step3 2.2.2.1.step1 2.2.2.2.step2 2.2.2.3.step3 2.2.2.4.step4新增測試 include include windows.h using namespace std 組合...

關於x64彙編呼叫api的問題

以radasm為例子 win32彙編呼叫api比較簡單 invoke api名字,引數 64位的就不會了 用ida看了一下生成的彙編 下面是個例子 call cs getcurrentprocess mov r9d,0ch nsize mov r8,rdi lpbuffer mov rdx,rsi ...