1. 程式人生 > >【lc3】彙編實現排序——student ID

【lc3】彙編實現排序——student ID

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:

本實驗中採用的比較排序法,是一種一種效率較低的排序方法。原先擬使用快速排序,苦於不知怎樣較好地實現遞迴,而非遞迴寫法又較為複雜。考慮到本實驗資料規模較小,暫且使用氣泡排序。