內嵌匯編是微軟為了提高程序的直接操作硬件能力,以及實現大任務程序效率的提高,而嵌入在VC中的,他不依賴于匯編器對內嵌匯編代碼進行匯編,這些內嵌匯編代碼由C編譯器內部實現,可以使程序好像自陷到匯編狀態一樣。這意味著你如果在C/C++程序中使用了?inline? asm進行?匯編?那么?就注定無法跨平臺的,對于沒有匯編基礎的同學是需要去學習下王爽的8086匯編程序設計。,因為有些時候C++程序員是不得不懂這些東西的 ,否則你永遠無法知道編譯器為你的函數做了什么,.你還有哪些地方需要優化,?不管處于什么目的??我感覺?作為C++程序員?是需要懂得的。
身邊的一位大哥給我講,用匯編不一定會比C/C++要快?這一點我很同意 。所以說程序的效率不單單是所操作的語言層次決定,更多的是程序編寫者的代碼的質量的高低決定。
**內嵌匯編?在C/C++中??通過**
**實際發現? 500W條數據??排序結果如下:**
**算法名稱 ?? 內嵌匯編算法時間 ?????? C/C++算法 時間 ? **
**冒泡排序 ?? 5W數據? 慢的要死? ??????????????? 5W數據 慢的要死**
**快速排序??????600ms左右 ?????????????????????????? 500ms左右 ??? ??**
**------------------為啥會出現快速排序算法,匯編出來的結果還沒有C/C++效率高呢,原因就是我寫的內嵌匯編沒有編譯器自動生成的效率高.**
**也就是代碼質量不高的緣故 。。~~**
~~~
_asm
{
...
}
_asm ....
~~~
引入匯編代碼,可以使程序自陷入匯編狀態,MMX匯編指令被大量應用于處理媒體引用中。。
**下面是冒泡排序代的內嵌匯編實現函數: **
~~~
時間復雜度 最好 T(n)=O(n)~O(n*n) 穩定算法
~~~
~~~
#define SIZE 10
void SortBubble(int arr[],int sizen)
{
int *p;
p=arr-1; //&a[0]-1
__asm
{
mov esi,p;
mov ecx,sizen;
_outter:
mov edx,ecx;
_inner:
cmp edx,ecx ;去掉相等情況
jz _exchange_no
mov eax,[esi+ecx*4]; ;在函數內部不可以直接通過數組下標獲取傳遞的數組 只能通過指針 進行尋址
mov ebx,[esi+edx*4 ];
cmp eax,ebx;
jnb _exchange_no;
mov [esi+ecx*4],ebx; ;交換連個元素
mov [esi+edx*4],eax;
_exchange_no:
dec edx;
jnz _inner;
loop _outter;
}
}
~~~
**冒泡排序結果如圖**

**
**
**用內嵌匯編實現快速排序算法**
~~~
//堆棧中 內存地位先存? 棧由高地址向低地址延伸
//esp -xxx
//注意參數名字不要和內嵌匯編 關鍵字沖突
void? QuickSortAsm(int arr[],int lowIndex,int highIndex)
{ ?
?int*p=arr;? //為了尋址方便
?int? begin; //
?int? end; //
?__asm
?{ ?
??? ?//;mov eax,[ebp+16] 堆棧高地址向低
??? //使用寄存器
??? mov?? eax,lowIndex? ;index first
??? mov?? ebx,highIndex ;index last
??? cmp?? eax,ebx? ;退程序 ?
??? jg??? _exit_func ?
??? mov?? esi,p???????? ;存儲數組地址-1用于尋址使用
??? mov?? edx,[esi+4*eax]????????? ;存放key
_outer:cmp?? eax,ebx?????????? ; 如果index first >index end
??? jnb?? _endLable???????? ;? 不符合條件退出 ??? ??? ??? ??? ????? ?
_find1: cmp?? eax,ebx?????????? ;進入第一層循環
??? jnb?? _inner1?????????? ;條件1
??? ;從后尋找第一個小于key的值
????? cmp?? [esi+4*ebx],edx? ;從后面開始比較數組元素和edx
??? jb??? _inner1????????? ;找出右邊第一個小于key的數組元素
??? sub?? ebx,1??????????? ;last index -1? last=last-1
??? jmp? _find1??????????? ;跳轉到循環頭
_inner1:
??? mov ecx,[esi+4*ebx]??? ;找到小于交換值
??? mov [esi+4*eax],ecx
_find2: cmp?? eax,ebx?????????? ;進入第一層循環
??? ?jnb?? _inner2?????????? ;條件1
??? ?;從后尋找第一個小于key的值
??? ?cmp?? [esi+4*eax],edx? ;從左邊找第一個大于key的元素
??? ?jg??? _inner2????????? ;針對有符號數
??? ?add?? eax,1??????????? ;first index+1 ?
??? ?jmp? _find2??????????? ;跳轉到循環頭
_inner2:
??? mov ecx,[esi+4*eax]???? ;將第一個大于的 和 軸交換
??? mov [esi+4*ebx],ecx
??? jmp _outer;
_endLable:
??? mov [esi+4*eax],edx? ;軸復位 ?
??? ///進行遞歸?? 參數自由向左
????? mov? begin,eax ;
??? mov? end,ebx? ?
?}
//? QuickSortAsm(arr,lowIndex,begin-1);
// ?? ?QuickSortAsm(arr,begin+1,highIndex);
?_asm
?{
??? ?mov??? ecx,begin? ; 遞歸1
??? ?sub??? ecx,1????? ;index -1
??? ?push?? ecx??????? ;
??? ?mov??? edx,lowIndex ; ?
??? ?push?? edx ?
??? ?mov??? eax,arr
??? ?push?? eax ?
??? ?call??????? QuickSortAsm
??? ?add???????? esp,0Ch??? ;堆棧平衡
??? ?mov???????? ecx,highIndex? ;遞歸2
??? ?push??????? ecx ?
??? ?mov???????? edx,begin ?
??? ?add???????? edx,1 ?
??? ?push??????? edx ?
??? ?mov???????? eax,arr ?
??? ?push??????? eax ?
??? ?call??????? QuickSortAsm
??? ?add???????? esp,0Ch?? ;恢復堆棧
?}
_exit_func:
?return ;
}
~~~
**如圖**
****
**
**
**冒泡排序算法的C/C++實現:**
~~~
// 時間復雜度 最好? T(n)=O(n)~O(n*n)? 穩定算法? ?
void? SortBubbleC(int arr[],int sizen)
{
? bool flag=true ;//若無交換 直接退出
? int tem;
? for(int i=0;i<sizen-1&flag;i++)
? {? ?
??? ? flag=false ;
??? ? for(int j=0;j<sizen-i-1;j++) //內序冒泡
??? ? {? ?
??? ??? ? if(arr[j]>arr[j+1])
??? ??? ? {? ?
??? ??? ??? ? flag=true ;
??? ??? ??? ? tem=arr[j];
??? ??? ??? ? arr[j]=arr[j+1];
??? ??? ??? ? arr[j+1]=tem;
??? ?????? ?
??? ??? ? }
??? ? }
? }
}
~~~
如圖

**C/C++快速排序算法的實現**
~~~
//C/C++的快速排序
void QuickSortC(int arr[],int low,int high)
{
if(low>high)
return ;
int begin=low ,end=high,key=arr[low];
while(begin<end)
{
while(begin<end&&arr[end]>=key)
--end;
arr[begin]=arr[end];
while(begin<end&&arr[begin]<=key)
++begin;
arr[end]=arr[begin];
}
arr[begin]=key ;
QuickSortC(arr,0,begin-1);
QuickSortC(arr,begin+1,high);
}
~~~

QQ 4223665 技術交流群? 387761601
歡迎大家一起交流學習軟件技術!
- 前言
- C++數據結構與算法------------二叉樹的2種創建
- 二叉樹的創建以及利用迭代實現中序、先序、后序遍歷、清空
- 數據結構-----哈夫曼樹的構造以及遍歷
- 二叉搜索樹的非遞歸創建和搜索
- 二叉搜索樹非遞歸方式刪除節點
- Lua中table內建排序與C/C++/Java/php/等內排序算法的排序效率比較
- 內嵌匯編與C/C++實現的冒泡排序,快速排序算法排序500W個數據對比
- 菜鳥學算法--簡單的交換和最大公約數算法入門篇
- 菜鳥學算法----改進后的歐幾里得算法
- C++實現一個線程安全的單例工廠
- 關于有序二維矩陣查找和字符串替換的兩道算法題
- 算法有序數組合并---在空間足夠的情況下,進行O(n)的合并 并且移動次數最小