閱讀927 返回首頁    go 阿裏雲 go 技術社區[雲棲]


匯編排序知識之冒泡排序

這裏簡單介紹匯編中是如何進行冒泡排序的,首先先回顧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

  上一篇:go 如何實現由Google Apps向Office 365的過渡?
  下一篇:go 下載並同步 Google Fonts 裏的字體到你的電腦