匯編排序知識之冒泡排序
這裏簡單介紹匯編中是如何進行冒泡排序的,首先先回顧C語言中的冒泡排序知識及算法,再講解匯編實現的過程,更好的鞏固和聯係了編程的思想。
一. C語言——冒泡排序
冒泡排序的基本概念: 依次比較相鄰的兩個數,將小數放在前麵,大數放在後麵。每完成一遍查找都會找到一個最大數,直至排序結束.
由上表可見每輪排序都能確定一個最大數,直至排序結束,它相對應的C語言代碼如下:其中j參數設置為N-i-1簡化了排序的複雜度,也可以是N-1.
二.匯編——冒泡排序
相對應的匯編冒泡排序如下圖所示:
DATAS SEGMENT A DW 0,15,70,30,32,89,12,12,34,4,38,23,45,13,43,24,54,24,54,1 Count EQU ($-A)/2 ;數組中元素的個數(字節) DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX ;------------------------------------------------------------------------- ;冒泡排序核心算法 A排序 MOV CX,Count-1 ;外層循環執行n-1次 I10: XOR SI,SI ;異或清零 XOR DI,DI I20: MOV AX,A[SI] MOV BX,A[SI+2] CMP AX,BX ;比較AX和BX大小:AX<BX(小於轉移)跳轉I30,否則交換兩數 JL I30 MOV A[SI],BX MOV A[SI+2],AX ;交換位置 I30: ADD SI,2 ;SI加2:移動一個數字位置 INC DI ;DI加1 CMP DI,CX ;比較CX和DI大小:DI<CX轉移,CX為外層循環總數n-1 JB I20 Loop I10 ;循環調至I10,Loop循環CX執行一次減1 ;------------------------------------------------------------------------- MOV AH,4CH INT 21H CODES ENDS END START
其中先在數據段中定義一個數組A並存儲20個數,而Count=($-A)/2存儲數組中元素的個數,其中$表示當前位置,即數組A中最後一個數位置減去A的起始位置,由於A是DW(2字節),所以除以2轉換為數組個數:20.
依次比較A中相鄰兩個數,存儲至AX=A[SI]和BX=A[SI+2]中,比較成立即交換否則跳轉至SI加2,繼續比較下一個相鄰兩數。
同時CX中記錄外層循環次數Count-1.利用Loop循環,Loop每循環依次默認的CX寄存器會減1,直至為0,循環停止。DI中記錄排序好的個數,每次加1與CX比較,直至排序結束。
輸出如下圖結果,這裏就省略了輸出函數。隻是想講講冒泡排序的過程,見諒!!!
希望能幫助大家更好的理解C語言與匯編中的冒泡排序的聯係與思想,謝謝!不足之處望讀者諒解。By:Eastmount
最後更新:2017-04-03 18:51:45