1. 程式人生 > >8086匯編寫冒泡排序並基於子程序設計輸出結果

8086匯編寫冒泡排序並基於子程序設計輸出結果

無法 堆棧 編寫冒泡排序 有符號數 內容 ascii 強行 自學 pps

寫在前面:也是萬年沒更新博客了……大二一年快過去了回首一下發現大二完全就不更新博客……原因很多吧,其一是感覺整理博客雖然能夠加深理解對學習幫助很大但是還是很花時間的,效益比較低,也是不如多看看書多刷刷題;其二也可以說是最主要的原因,大二一年比較功利,做事學習也是很側重性價比,想績點各方面刷好然後杠一個國家獎學金,因此很少更新博客。這次更新記錄我們最後一次匯編實驗,很基礎但是完全自學然後強行擼掉之後,內心感覺還是很快樂的。就感覺這是我在大一的狀態,全身心的攻克一個比較困難的題,懟上一整天的時間,最終收獲的快樂是刷績點哪都瞎幾把水水無法比擬的。好了就感慨到這,下面上正文。

1.1實驗內容:

DATA1開始的內存單元中,存放著一串帶符號字數據,要求采用冒泡排序算法(Bubble Sort)按照從小到大的順序排序並將排好序的數據存在DATA1開始的單元。然後在顯示 器輸出排好序的數據,中間用’,’隔開。

排序采用循環程序。

輸出數據使用子程序方式。

PS:這裏輸出之所以需要做子程序,是因為只要和顯示器輸出有關都是和ASCII有關,需要做一步二進制到10進制以及數字到ASCII的轉化。

PPS:流程圖沒有傳上來,因為比較大傳上來應該不好看,參考文章後面的源代碼不難畫出流程圖。

1.2算法分析:

這次實驗內容相對於前幾次,較為綜合,因此我們在算法分析的時候需要進行模塊化的分析,對各個模塊進行逐一擊破。

1.2.1冒泡排序

有過高級語言的學習基礎對這個內容不會陌生,我們下面完成兩個步驟,第一個再簡單的用語言描述一下冒泡排序的思想和算法步驟,為下面的匯編程序設計打基礎,第二我們就給出冒泡排序的匯編程序流程圖。

1.2.1.1冒泡排序算法思想:

整體上分兩層循環,假設第一層的指示變量是i,第二層指示變量為j,那麽按照冒泡排序的思想,我們第一層循環一趟的目的,就是將這個數組倒數第i個位置的正確數值確定,為了完成外層循環的目的,內層循環就需要掃描數組第

0~n-i個位置,比較相鄰的兩個位置,如果前面較大,則進行一次交換。

1.2.1.2偽代碼描述如下:

  Bubble_sort(A)

   1. For i = 0 to n - 1
   2.   For j = 1 to n - i
   3.      If(A[j] > A[j-1])
   4.         Exchange A[j] with A[j-1]

1.2.2輸出部分:

按照題目要求,這裏要利用子程序設計的方式進行輸出。也就是我們在輸出的時候,在外層設置一個循環控制,循環中對每個內存單元以10進制數形式進行輸出即可。

1.2.2.1算法整體思想:

首先來整體的考慮下這個算法設計需要註意什麽問題,題目要求中明確給出了是有符號數,因此這裏面在輸出的時候為了直觀,我們需要將符號-’給體現出來,這就要求算法設計的時候需要考慮數字的正負。其次我們還需要考慮如何根據機器數轉化成對應的10進制數,與高級語言類似,我們設置叠代過程,利用DIV指令,對原始數據多次除10,並將余數取出壓棧,然後加上對應的數值(30H)得到對應數字的ASCII碼,然後輸出即可。

1.3 代碼

  1 DATAS SEGMENT
  2     DATA DB  2 , 1 , 0 , -1  ,-2
  3     COUNT DB  5
  4 DATAS ENDS
  5 
  6 STACKS SEGMENT
  7     ;此處輸入堆棧段代碼
  8 STACKS ENDS
  9 
 10 CODES SEGMENT
 11     ASSUME CS:CODES,DS:DATAS,SS:STACKS
 12 START:
 13     MOV AX,DATAS
 14     MOV DS,AX
 15     MOV CL , 0H
 16     
 17     
 18      ;冒泡排序開始
 19       MOV CL , COUNT;外層循環指示變量
 20 OUTLOOP:    
 21      MOV AL , CL;內部循環指示變量初始化
 22       DEC AL
 23       MOV CH , AL
 24       MOV BX , OFFSET DATA + 1;數據指針
 25 INLOOP:
 26       MOV AH , [BX-1]
 27       MOV AL , [BX]
 28       CMP AH , AL
 29       JS NOT_CHANGE
 30       MOV [BX] , AH
 31       MOV [BX - 1] , AL
 32       NOT_CHANGE :
 33       INC BX 
 34       DEC CH
 35       JNZ INLOOP
 36       DEC CL
 37       CMP CL  , 1
 38       JNZ OUTLOOP  ;冒泡排序結束
 39      
 40      ;開始進行輸出
 41 
 42      MOV BX , OFFSET DATA
 43     MOV CL , COUNT
 44 PRINT_LOOP:
 45      MOV AL , [BX]
 46      MOV AH , 00H
 47      INC BX
 48      CALL FUN
 49      DEC CL
 50      JZ ENDD
 51      MOV AH , 02H
 52      MOV DX , ,
 53      INT 21H
 54      AND CL , CL           
 55      JNZ PRINT_LOOP
 56        
 57 ENDD:
 58      MOV AH,4CH
 59      INT 21H
 60 
 61     
 62     
 63 FUN PROC NEAR    
 64     ;MOV DL , 10
 65 SHABI:
 66     PUSH CX
 67     MOV CL , 00H
 68     AND AL , AL
 69     JNS POS
 70     PUSH AX
 71     MOV AH , 02H
 72     MOV DX , -
 73     INT 21H
 74     POP AX
 75     NEG AL
 76 POS:
 77     MOV DL , 10
 78     DIV DL      ;[AX]/10  AL是商 , AH是余數
 79     MOV DL , AH
 80     AND AH , 0H ;清空余數
 81     ADD DL , 48
 82     MOV DH , 00H
 83     PUSH DX
 84     INC CL
 85     AND AL , AL
 86     JNZ SHABI
 87    
 88 PRINT:
 89     POP DX
 90     MOV AH , 02H
 91     INT 21H
 92     DEC CL
 93     JNZ PRINT
 94     
 95     POP CX
 96     RET
 97 FUN ENDP    
 98     
 99 CODES ENDS
100     END START

8086匯編寫冒泡排序並基於子程序設計輸出結果