实验一、数据排序实验一、实验目的熟悉8031指令系统,掌握程序设计方法。二、实验内容编写并调试一个排序子程序,其功能为用冒泡法将内部RAM中几个单元字节无符号的正整数,按从小到大的次序重新排列。三、实验程序框图NNN四、实验步骤1把8032片内RAM区50H—5AH中放入不等的数据(用寄存器读写方法)。2用连续运行方式从起始地址0100H开始运行程序(输入0100后按EXEC键)。3排序结束,显示“P.”。4用寄存器读写方法检查50—5AH中内容应从小到大排列。五、参考程序DORDE:MOVSP,#60H设置栈指针MOVR3,#50HDORDE1:MOVA,R3MOVR0,A数据指针传送到R0MOVR7,#0AH长度送到R7CLR00H清零标志位MOVA,@R0DORDE2:INCR0MOVR2,ACLRC清零进位标志MOV22H,@R0CJNEA,22H,DORDE3是否相等SETBCDORDE3:MOVA,R2JCDORDE4小于或等于不交换SETB00HXCHA,@R0DECR0XCHA,@R0大于交换位置INCR0DORDE4:MOVA,@R0DJNZR7,DORDE2JB00H,DORDE1未完继续MOVR0,#7EH完,关显示器前三位MOVA,#0FFHMOVR4,#06HDORDE5:MOV@RO,ADECR0DJNZR4,DORDE5MOV7EH,#0CH
#include<stdio.h>
#include<stdlib.h>
#define N 8
void select_sort(int a[],int n)
//选择排序实现
void select_sort(int a[],int n)//n为数组a的元素个数
{
//进行N-1轮选择
for(int i=0i<n-1i++)
{
int min_index = i
//找出第i小的数所在的位置
for(int j=i+1j<nj++)
{
if(a[j] <a[min_index])
{
min_index = j
}
}
//将第i小的数,放在第i个位置;如果刚好,就不用交换
if( i != min_index)
{
int temp = a[i]
a[i] = a[min_index]
a[min_index] = temp
}
}
}
int main()
{
int num[10] = {8, 3, 11, 7, 9, 84, 19, 25,22,33}
select_sort(num, 10)
for(int i=0i<10i++)
printf("%d ", num[i])
printf("\n")
system("pause")
return 0
}
用汇编语言实现排序,通常使用冒泡法。将数据段DATA开始的16个数排序,前小后大,程序示例如下:DATAS SEGMENT
DATA DB 74,68,58,66,69,254,186,6,10,98,34,90,128,222,33,0
COUNT DB 10H
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,ES:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
MOV BL,1 用BL来检验是否排序完成,减少循环次数
LOOP1:
CMP BL,0
JE CMPEND 若相等则跳转
XOR BL,BL 将BL清零
MOV CL,COUNT COUNT用于外层的计数
DEC CL CL减一,CL用于内层的计数
PUSH CX将CX压入堆栈
LEA DI,DATA将数据段首地址赋值给DI
LOOP2:
MOV AL,[DI]
CMP AL,[DI+1] 将前一个数与后一个数比较
JLE LOOP3 若前一个数小于或等于后一个数,则跳转到LOOP3
XCHG [DI+1],AL前者大于后者,则交换两数
MOV [DI],AL 如果前一个数字大于后一个数字,则交换
MOV BL,1
LOOP3:
INC DI指针加一
LOOP LOOP2循环L00P2,直到CX==0成立
POP CX将CX从堆栈中d出
MOV COUNT,CL 改变外层计数器的值
JMP LOOP1
CMPEND:
MOV AH,4CH 带返回码结束功能
INT 21H返回系统
CODES ENDS
END START
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)