【lc3】彙編實現排序——student ID
阿新 • • 發佈:2019-02-14
Purpose:
There are 64 students. Each has a unique ID,which consists of two integer. Given ID1 = (a1, a2) and ID2 = (b1, b2), then Ifa1 > b1, then ID1 > ID2; If a1 = b1, then: If a2 > b2, then ID1 >ID2; If a2 = b2, then ID1 = ID2; If a2 < b2, then ID1 < ID2; If a1 <b1, then ID1 < ID2. Write a program in assembly language to sort studentIDs.
Principles:
1. 將輸入位置的的內容複製到輸出位置
2. 在輸出地址原處進行氣泡排序,具體見下面程式碼分析中的內外兩個迴圈
3. 兩個數字比較大小的方法是對其中一個·數字取反加一,然後將至與另外一個數字相加,判斷結果的正負,然後據此使用BR 指令進行選擇跳轉
Procedure:
程式碼分析:
.ORIG x3000 LD R2,INPUT LD R3,OUTPUT AGAIN LDR R4,R2,#0 STR R4,R3,#0 ADD R2,R2,#1 ADD R3,R3,#1 LD R4,INPUTE NOT R4,R4 ADD R4,R4,#1 ADD R4,R4,R2 BRnz AGAIN ;將輸入全部複製到輸出位置,最終 R3 儲存 OUTPUTENDQI+1 位置 BAGAIN ADD R3,R3,#-2 ;然後進行氣泡排序(如下),BAGAIN 為外迴圈 LD R4,OUTPUT NOT R4,R4 ADD R4,R4,#1 ADD R4,R4,R3 BRz OVER LD R2,OUTPUT ;判斷 BAGAIN 是否結束 ADD R2,R2,#-2 SAGAIN ADD R2,R2,#2 ADD R4,R3,#0 NOT R4,R4 ;SAGAIN 為內迴圈 ADD R4,R4,#1 ADD R4,R4,R2 BRz BAGAIN LDR R4,R2,#0 LDR R5,R2,#2 NOT R4,R4 ADD R4,R4,#1 ADD R5,R4,R5 BRn SAGAIN BRz CMP ;如果兩個元素中第一個數相等,則進行第二數字的比較 BRP SWAP ;如果前一個元素小於後一個,則交換二者位置 CMP LDR R4,R2,#1 LDR R5,R2,#3 NOT R4,R4 ADD R4,R4,#1 ADD R5,R4,R5 BRnz SAGAIN BRp SWAP SWAP LDR R4,R2,#0 ;實現對相鄰元素的交換 LDR R5,R2,#2 STR R4,R2,#2 STR R5,R2,#0 LDR R4,R2,#1 LDR R5,R2,#3 STR R4,R2,#3 STR R5,R2,#1 BRnzp SAGAIN OVER HALT INPUT .FILL X3200 INPUTE .FILL x327F OUTPUT .FILL X4000 .END
result:
結果測試;匯入 data.obj 檔案
資料如下(部分):內容均為符號位擴充套件後表示
結果:
驗證可知結果正確
Some thoughts:
本實驗中採用的比較排序法,是一種一種效率較低的排序方法。原先擬使用快速排序,苦於不知怎樣較好地實現遞迴,而非遞迴寫法又較為複雜。考慮到本實驗資料規模較小,暫且使用氣泡排序。