单片机实验数据排序

单片机实验数据排序,第1张

原发布者:瀚海湛蓝

实验一、数据排序实验一、实验目的熟悉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

本程序通过编译,运行正确

Code Segment

Assume CS:Code,DS:Code

-----------------------------------------

定义常量

YesEQU 1

No EQU 0

On EQU 1

OffEQU 0

----衡或胡-------------------------------------

定义结构类型

Bubb_Para Struc 冒泡排序法参数表

Carry DB No 是否带符号。Yes:有符号数;No:无符号数

Sort DB No 升序/降序。Yes:升序;No:降序

Arry_Addr DW ? 数组地址

Arry_Type DB ? 数组元素类型

Yes_No DB 73h,76h,7dh,7eh

Load DB 0ach,0adh

Comp DB 3ah,3bh

Exchange DB 86h,87h

Store DB 0aah,0abh

Bubb_Para EndS

-----------------------------------------

冒泡法排序

功能:按要求对数组元素排序,能够对字节元素、字元素进行无符号数、有符号数的升序、降序排序。

子程序原型:对字节元素进行无符号升序排序。

入口:SI=冒泡排序法参数表地址

Bubbling Proc Near

PUSH AX

PUSH BX

PUSH CX

PUSH SI

PUSH DI

push ds

push es

------------------根据排序参数,修改排序指令

push cs

pop ds

push cs

pop es

LEA DI,@@Compare

MOV AL,[SI.Arry_Type]

DEC AL

PUSH AX

LEA BX,[SI.Load]

XLAT

MOV [DI][2],AL

POP AX

PUSH AX

LEA BX,[SI.Comp]

XLAT

MOV [DI][3],AL

POP AX

PUSH AX

LEA BX,[SI.Exchange]

XLAT

MOV [DI][7],AL

POP AX

LEA BX,[SI.Store]

XLAT

MOV [DI][9],AL

MOV AL,[SI.Carry]

SHL AL,1

OR AL,[SI.Sort]

XOR AH,AH

LEA BX,[SI.Yes_No]

XLAT

MOV [DI][5],AL

------------------按要求排序

MOV SI,[SI.Arry_Addr] 数组地址

pop es

pop ds

CLD

MOV CX,count-1 外咐拦循环次数

@@Scanning: PUSH CX 入栈保存外循环次数

PUSH SI 入栈保存数组地址

@@Compare: PUSH SI

POP DI 当前数组元素地址赋给目的变址寄存器,以备交换之用

LODSB 将当前数组元素读入累加器

CMP AL,[SI] 当前团孙数组元素与相邻的下一个数组元素相比较

JBE @@NextOne 若小于或等于,不作数据交换,处理下一个数组元素

XCHG AL,[SI] 若大于,交换数组元素

STOSB 保存数值较小者

@@NextOne: LOOP @@Compare 处理下一个数组元素

POP SI 数组地址出栈

POP CX 外循环次数出栈

LOOP @@Scanning 下一趟比较

------------------

POP DI

POP SI

POP CX

POP BX

POP AX

RET

Bubbling EndP

-----------------------------------------

功能:输出一个字符

入口:dl=要显示的字符

Enter_Chr proc Near

push ax

mov ah,02h

int 21h

pop ax

ret

Enter_Chr endp

-----------------------------------------

功能:将AL中的低4位二进制数转换成十六进制显示的ASCII码

入口:AL

出口:AL=转换后的ASCII码

AL_ASCII Proc Near

cmp al,10 AL<10?

jb @@To_ASCII AL<10,按数字处理

add al,7 AL>=10,按大写字母处理

@@To_ASCII: add al,'0' 转换成相应的数字或大写字母

ret

AL_ASCII EndP

-----------------------------------------

功能:将AL中的字节数转换成十六进制显示的ASCII码

入口:AL

出口:AX=转换后的ASCII码

Byte_ASCII Proc Near

push cx

mov cx,4

xor ah,ah 将AH置0

shl ax,cl 将AX左移4位

shr al,cl 将AL右移4位

xchg ah,al

call AL_ASCII 调用子程序,将AL中的值转换成相应的ASCII码

xchg ah,al

call AL_ASCII

xchg ah,al

pop cx

ret

Byte_ASCII EndP

-----------------------------------------

功能:将AX中的字数据转换成十六进制显示的ASCII码,并在当前光标位置显示

入口:AX

WordD_ASCII Proc Near

push dx

push ax

push ax

xchg ah,al

call Byte_ASCII 将AL中的字节数转换成十六进制显示的ASCII码

cmp al,'9'

jbe $+7

mov dl,'0'

call Enter_Chr 显示一个字符

mov dl,al

call Enter_Chr 显示一个字符

mov dl,ah

call Enter_Chr 显示一个字符

pop ax

call Byte_ASCII 将AL中的字节数转换成十六进制显示的ASCII码

mov dl,al

call Enter_Chr 显示一个字符

mov dl,ah

call Enter_Chr 显示一个字符

mov dl,'H'

call Enter_Chr 显示一个字符

pop ax

pop dx

ret

WordD_ASCII EndP

-----------------------------------------

EVEN

Buffer dw 12345,32189,65531,65432,10000,7896,65498,54321 数组变量

count equ ($-Buffer)/type Buffer 数组元素个数

Parameters Bubb_Para <No,Yes,OFFSET Buffer,2>无符号字数据、升序排序

Start: push cs

pop ds

push cs

pop es 使数据段、附加段与代码段同段

lea si,Parameters

call Bubbling 对Buffer中的元素排序

lea si,Buffer 数组Buffer地址

mov cx,count

Disp_Arry: lodsw 读取一个数组元素

call WordD_ASCII 将AX中的字数据转换成十六进制显示的ASCII码,并在当前光标位置显示

cmp cx,1

jz $+7

mov dl,',' 数组元素分隔符

call Enter_Chr 显示一个字符

loop Disp_Arry

Exit_Proc: mov ah,4ch 结束程序

int 21h

Code ENDS

END Start 编译到此结束


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8277586.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存