实验一、数据排序实验一、实验目的熟悉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 编译到此结束
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)