【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:

本实验中采用的比较排序法,是一种一种效率较低的排序方法。原先拟使用快速排序,苦于不知怎样较好地实现递归,而非递归写法又较为复杂。考虑到本实验数据规模较小,暂且使用冒泡排序。


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值