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