匯編語言實現(xiàn)冒泡排序(一)_第1頁
匯編語言實現(xiàn)冒泡排序(一)_第2頁
匯編語言實現(xiàn)冒泡排序(一)_第3頁
匯編語言實現(xiàn)冒泡排序(一)_第4頁
匯編語言實現(xiàn)冒泡排序(一)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、; 用匯編語言實現(xiàn)實現(xiàn)冒泡排序,并將排序后的數(shù)輸出DATAS SEGMENTA dw 100,344,3435,43433,3438,343,134,80,8,1000,65535,54,45 N =$-A ; 計算數(shù)字所占的字節(jié)數(shù)DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART :MOV AX,DATASMOV DS,AXMOV SI,0 ;SI 遍歷數(shù)字 ; 前一個數(shù)的地址MOV CX,N/2-1 ; 設(shè)置循環(huán)次數(shù), M(M=N/2個數(shù)需要,循環(huán) M-1次 CALL BUBBLE ; 調(diào)用 BUBBLE 將原來的數(shù)排序; 輸出排序后的

2、數(shù)MOV CX,N/2 ; 循環(huán) M 次輸出排序后的 M 個數(shù)MOV SI,0 ;SI 遍歷排序后的數(shù)MOV DI,0 ; 用 DI 記錄數(shù)字的位數(shù)MOV BP,N+5 ;BP 用于遍歷存儲的轉(zhuǎn)化后的字符的位置SHOW: PUSH CX ; 循環(huán)次數(shù)入棧MOV DX,0 ; 由于將要進行 16位除需要置高 16位為 0MOV AX,SI ; 低 16位為排序后的數(shù)CALL DTOC ; 調(diào)用 DTOC 將十進制數(shù)轉(zhuǎn)換為字符串CALL SHOW_STR ; 調(diào)用 SHOW_STR將一個數(shù)轉(zhuǎn)化得到的字符串輸出 ADD SI,2 ; 下一個數(shù)POP CX ; 循環(huán)次數(shù)出棧棧LOOP SHOWMOV

3、AH,4CHINT 21H; 冒泡排序BUBBLE PROCL1: PUSH CX ; 將循環(huán)次數(shù)入棧LEA SI,A ;SI 遍歷 DATAS 數(shù)據(jù)段的數(shù)字L2: MOV AX,ASI ; 將前一個數(shù)存于 AXCMP AX,ASI+2 ; 比較前后兩個數(shù)JBE NEXT ; 如果前一個數(shù)小于或等于后一個數(shù)則繼續(xù)本輪的比較 XCHG AX,ASI+2 ; 否則,交換前后兩個數(shù)的位置MOV ASI,AXNEXT:ADD SI,2 ; 下一個數(shù)LOOP L2 ; 注意內(nèi)層循環(huán)的次數(shù)已經(jīng)確定了POP CX ; 將循環(huán)次數(shù)出棧LOOP L1 ; 下一輪比較RETBUBBLE ENDP; 將十進制數(shù)轉(zhuǎn)換

4、為字符串并儲存起來DTOC PROCS:MOV CX,10 ; 將除數(shù) 10,放入 CX 中CALL DIVDW ; 調(diào)用 DIVDW 程序ADD CL,30H ; 把數(shù)字轉(zhuǎn)換為 ASCII 碼,這樣就能顯示了MOV DS:BP,CL ; 把 ASCII 碼放到內(nèi)存中INC DI ; 用 DI 記錄循環(huán)的次數(shù)PUSH AX ; 將低 16位入棧ADD AX,DX ; 將高位與低位相加,接著判斷是否已經(jīng)除盡JZ BACK ; 除盡后返回調(diào)用處POP AX ; 將低 16位出棧DEC BP ; 逆序存放轉(zhuǎn)化后的字符,便于主程序調(diào)用 SHOW_STR JMP SBACK:POP AX ; 為了得到正

5、確的 IP 值,需要出棧一次RETDTOC ENDP; 子程序定義開始 , 功能是分離被除數(shù)的各個位的數(shù)字; 公式:X/N=int(H/N*65536+rem(H/N*65536+L/NDIVDW PROCPUSH AX ; 低 16位入棧MOV AX,DX ; 將高 16位寫入 AX,MOV DX,0 ; 將高 16位置零DIV CX ; 將新的數(shù)除 10,MOV BX,AX ; 將商 int(H/N轉(zhuǎn)移到 BX ,默認余數(shù) rem(H/N在 DX POP AX ; 將低 16位出棧,DIV CX ; 將 rem(H/N*65536+L除 10, 默認余數(shù)在 DXMOV CX,DX ; 將余

6、數(shù)轉(zhuǎn)移到 CXMOV DX,BX ; 將商 int(H/N轉(zhuǎn)移到 dx, 相當于 int(H/N*65536RET ; 子程序定義結(jié)束DIVDW ENDP; 實現(xiàn)字符串的輸出SHOW_STR PROCS2:MOV AH,2 ; 輸出數(shù)字轉(zhuǎn)化后的字符串MOV DL,DS:BPINT 21HINC BP ; 順序輸出DEC DI ; 數(shù)字的位數(shù)減一JZ OK ; 字符串輸出完了就結(jié)束JMP S2 ; 否則繼續(xù)輸出OK:MOV AH,2 ; 輸出空格MOV DL,0INT 21HRETSHOW_STR ENDPCODES ENDSEND START; 實現(xiàn)冒泡排序,并將排序后的數(shù)輸出DATAS SE

7、GMENTA dw 100,344,3435,43433,3438,343,134,80,8,1000,65535,54,45 N=$-A ; 計算數(shù)字所占的字節(jié)數(shù)DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART :MOV AX,DATASMOV DS,AXMOV SI,0 ;SI 遍歷數(shù)字 ; 前一個數(shù)的地址MOV CX,N/2-1 ; 設(shè)置循環(huán)次數(shù), M(M=N/2個數(shù)需要,循環(huán) M-1次 CALL BUBBLE ; 調(diào)用 BUBBLE 將原來的數(shù)排序; 輸出排序后的數(shù)MOV CX,N/2 ; 循環(huán) M 次輸出排序后的 M 個數(shù)MOV

8、 SI,0 ;SI 遍歷排序后的數(shù)MOV DI,0 ; 用 DI 記錄數(shù)字的位數(shù)MOV BP,N+5 ; 用于遍歷存儲的轉(zhuǎn)化后的字符的位置SHOW: PUSH CX ; 循環(huán)次數(shù)入棧MOV DX,0 ; 由于將要進行 16位除需要置高 16位為 0MOV AX,SI ; 低 16位為排序后的數(shù)CALL DTOC ; 調(diào)用 DTOC 將十進制數(shù)轉(zhuǎn)換為字符串CALL SHOW_STR ; 調(diào)用 SHOW_STR將一個數(shù)轉(zhuǎn)化得到的字符串輸出 ADD SI,2 ; 下一個數(shù)POP CX ; 循環(huán)次數(shù)出棧棧LOOP SHOWMOV AH,4CHINT 21HBUBBLE PROCL1: PUSH CX

9、; 將循環(huán)次數(shù)入棧LEA SI,A ;SI 遍歷 DATAS 數(shù)據(jù)段的數(shù)字L2: MOV AX,ASI ; 將前一個數(shù)存于 AXCMP AX,ASI+2 ; 比較前后兩個數(shù)JBE NEXT ; 如果前一個數(shù)小于或等于后一個數(shù)則繼續(xù)本輪的比較XCHG AX,ASI+2 ; 否則,交換前后兩個數(shù)的位置MOV ASI,AXNEXT:ADD SI,2 ; 下一個數(shù)LOOP L2 ; 注意內(nèi)層循環(huán)的次數(shù)已經(jīng)確定了POP CX ; 將循環(huán)次數(shù)出棧LOOP L1 ; 下一輪比較RETBUBBLE ENDP; 將十進制數(shù)轉(zhuǎn)換為字符串并儲存起來DTOC PROCS:MOV CX,10 ; 將除數(shù) 10,放入 C

10、X 中CALL DIVDW ; 調(diào)用 DIVDW 程序ADD CL,30H ; 把數(shù)字轉(zhuǎn)換為 ASCII 碼,這樣就能顯示了MOV DS:BP,CL ; 把 ASCII 碼放到內(nèi)存中INC DI ; 用 DI 記錄循環(huán)的次數(shù)PUSH AX ; 將低 16位入棧ADD AX,DX ; 將高位與低位相加,接著判斷是否已經(jīng)除盡 JZ BACK ; 除盡后返回調(diào)用處POP AX ; 將低 16位出棧DEC BP ; 逆序存放轉(zhuǎn)化后的字符,便于主程序調(diào)用 SHOW_STR JMP SBACK:POP AX ; 為了得到正確的 IP 值,需要出棧一次RETDTOC ENDP; 子程序定義開始 , 功能是分

11、離被除數(shù)的各個位的數(shù)字; 公式:X/N=int(H/N*65536+rem(H/N*65536+L/NDIVDW PROCPUSH AX ; 低 16位入棧MOV AX,DX ; 將高 16位寫入 AX,MOV DX,0 ; 將高 16位置零DIV CX ; 將新的數(shù)除 10,MOV BX,AX ; 將商 int(H/N轉(zhuǎn)移到 BX ,默認余數(shù) rem(H/N在 DX POP AX ; 將低 16位出棧,DIV CX ; 將 rem(H/N*65536+L除 10, 默認余數(shù)在 DX MOV CX,DX ; 將余數(shù)轉(zhuǎn)移到 CXMOV DX,BX ; 將商 int(H/N轉(zhuǎn)移到 dx, 相當于 int(H/N*65536 RET ; 子程序定義結(jié)束DIVDW ENDP; 實現(xiàn)字符串的輸出SHOW_STR PROC

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論