C#呼叫匯編dll
組合語言有效能優勢,C#有靈活性,組織結構優勢。兩者結合使用是我的理想。
想法是大的元件和類層次使用C#;關鍵子程式使用匯編DLL。
可以從網上下載MASM32工具包。版本可以是8.2或者9.0。
我用匯編寫了一個DLL。功能是求和整數陣列。
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.code
LibMain proc hInstDLL:DWORD, reason:DWORD, unused:DWORD
.if reason == DLL_PROCESS_ATTACH
MOV EAX,TRUE
ret
.endif
ret
LibMain Endp
SumArray proc StdCall point:DWORD,len:DWORD
push esi
push ebx
mov esi,point
mov ebx,len
mov eax,[esi]
dec ebx
.if ! zero?
.repeat
add esi,4
add eax,[esi]
dec ebx
.until zero?
.endif
pop ebx
pop esi
ret
SumArray endp
End LibMain
我也是剛學的彙編,如果有什麼失誤的話,就請多指教了。
儲存為dll.asm之後,點project->build all選單。已經生成了dll.obj。
之後寫dll.def檔案:
LIBRARY dll
EXPORTS SumArray
執行masm32/bin目錄下的命令link /subsystem:windows /dll /def:d:/project/asm/dll.def d:/project/asm/dll.obj
這樣在bin目錄下就有了dll.dll檔案。(不是很熟,勿笑)
在C#裡呼叫這個dll並不複雜。
1.將那個dll.dll拷貝到bin/debug目錄下。
2.加上using System.Runtime.InteropServices;
3.宣告外部方法
[DllImport("dll.dll")]
public static extern Int32 SumArray(Int32* point, Int32 length);
4.呼叫
sum = SumArray(point, source.Length);
5.因為使用了指標,所以需要把類設為unsafe;
public unsafe partial class Form1
6.設定專案的unsafe屬性。
我編了段程式測試它的效能:
Random random = new Random();
for (int i = 0; i < source.Length; i++)
{
source[i] = random.Next(100);
}
int sum=0;
long start = Environment.TickCount;
for (int time = 0; time < 1000; time++)
{
sum = 0;
foreach (int v in source)
{
sum += v;
}
}
long cost = Environment.TickCount - start;
Console.WriteLine("MSIL result={0};cost={1}", sum, cost);
start = Environment.TickCount;
for (int time = 0; time < 1000; time++)
{
sum = 0;
fixed(int* pstart = source, pend = &source[source.Length-1])
{
for (int* pnow=pstart; pnow < pend; pnow++)
{
sum += *pnow;
}
}
}
cost = Environment.TickCount - start;
Console.WriteLine("CSP result={0};cost={1}", sum, cost);
fixed (int* point = source)
{
start = Environment.TickCount;
for (int time = 0; time < 1000; time++)
{
sum = CalArray(point, source.Length);
}
cost = Environment.TickCount - start;
Console.WriteLine("MASM result={0};cost={1}",sum,cost);
}
跑下來的結果,C#遍歷求和平均630毫秒,C#指標求和420毫秒,彙編求和180毫秒。這還沒用MMX。
原文地址:http://www.cnblogs.com/fujingqiu/ 作者應該是:fujingqiu 吧
相關文章
- C# 生成DLL 並 呼叫C#
- C#呼叫 C++的DLLC#C++
- C++呼叫 c#生成的dllC++C#
- C++呼叫C#的動態庫dllC++C#
- c#呼叫C++DLL EntryPointNotFoundException 找不到入口點C#C++Exception
- NX二次開發-C#使用DllImport呼叫libufun.dll裡的UF函式(反編譯.net.dll)呼叫loop等UF函式C#Import函式編譯OOP
- P/Invoke之C#呼叫動態連結庫DLLC#
- C# 呼叫 C++ 生成的 dll 關鍵實現部分C#C++
- 如何建立Electron + Vue3專案, 並呼叫C# dllVueC#
- exe呼叫DLL的方式
- Nodejs如何呼叫Dll模組NodeJS
- php 呼叫dll 裡面的方法PHP
- VS2012生成C的dll並呼叫以及Python呼叫C的DLLPython
- c# 呼叫 C++ dll 傳入傳出型別對應說明(轉)C#C++型別
- 全方位解讀DLL檔案—編寫DLL
- C# 程式修改dll引用路徑C#
- C#呼叫PythonC#Python
- C#呼叫pydC#
- java呼叫DLL,呼叫北洋印表機列印二維碼標籤Java
- JAVA呼叫C語言下的DLL檔案JavaC語言
- VS中呼叫DLL動態庫的方法
- java中呼叫dll檔案的步驟Java
- 實現通過COM元件方式實現java呼叫C#寫的DLL檔案的完整demo元件JavaC#
- C#配置程式引用的dll的位置C#
- c# 反射呼叫方法C#反射
- 使用使用rundll32 呼叫指定dll的方法
- QT5.12 匯出exe依賴的dllQT
- C#中Emgucv呼叫HalconC#
- C#呼叫python的方法C#Python
- CefSharp ——js呼叫c#方法JSC#
- xLua中C#呼叫LuaC#
- xLua中Lua呼叫C#C#
- C#/.net程式呼叫pythonC#Python
- C# 呼叫Python程式碼C#Python
- dll預編譯提高webpack打包速度編譯Web
- 【混合程式設計】C/C++呼叫Fortran的DLL程式設計C++
- dll反編譯(修改引用檔案、修改程式碼)再生成dll編譯
- Windows環境下,動態連結庫(DLL)的“匯入”與“匯出”概念Windows
- 【大型軟體開發】開發日誌(五).net框架與C++的融合:CLR——C++呼叫C#的DLL框架C++C#