汇编实验4
实验目的
1、掌握用汇编语言编写排序程序的思路和方法。
2、掌握分支、循环、子程序调用等基本的程序结构。
3、学习综合程序的设计、编制及调试。
实验内容
要求设计一程序将这些数由小到大排序,排序后的数,仍放在该区域中。
给定数据版
CRLF MACRO
MOV DL,0DH
MOV Ah,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM ;定义宏功能用于换行
STRSHOW MACRO buff;buff表示要显示字符串标号
mov dx,offset buff
mov ah,09H
int 21H
ENDM;定义宏功能用于显示字符串
;定义数据段
datas segment
;输出提示信息
MESS1 db 'before sort:',0DH,0AH,'$'
MESS2 db 'after sort:',0DH,0AH,'$'
;排序数据
data db 56H,4EH,6AH,9CH,12H,0A4H,26H,38H ;排序数据
NUM EQU 8;排序数据个数
datas ends
;定义栈段
stack segment stack 'stack'
STA db 128 dup(?)
TOP EQU LENGTH STA
stack ends
code segment
ASSUME cs:code,ds:datas,ss:stack
START:;初始化相关寄存器
mov ax,datas
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,TOP
STRSHOW MESS1;调用宏功能输出MESS1
call SHOWDATA;调用宏功能输出数据
mov cx,NUM
dec cx;外循环次数
outer:
mov dx,cx;内循环次数
lea bx,data;取data的偏移量
iner:
mov al,[bx]
cmp al,[bx+1];比较相邻数据大小
jna next;前小于后,继续排序过程
;前大于后,进行交换
xchg al,[bx+1]
mov [bx],al
next:
inc bx
dec dx
jnz iner
LOOP outer
STRSHOW MESS2;调用宏功能输出MESS2
call SHOWDATA;调用宏功能输出数据
mov ax,4c00h
int 21h
;将al中的数据以十六进制输出
DISP PROC
push ax
push cx
mov cl,4
ror al,cl;循环右移4位,取高4位
CALL TOASC;调用子程序输出字符
ror al,cl;循环右移4位,取低4位
CALL TOASC;调用子程序输出字符
pop cx
pop ax
RET
DISP ENDP
;辅助输出子程序
TOASC PROC
push ax
push bx
push dx
lea bx,ASCII;bx指向转化表
and al,0FH
xlat cs:ASCII;al<--cs:[bx+al]
;输出
mov dl,al
mov ah,2
int 21H
pop dx
pop bx
pop ax
RET
;子程序的数据区
ASCII db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h
db 41h,42h,43h,44h,45h,46h
TOASC ENDP
;输出data数据区的数据
SHOWDATA PROC
mov cx,NUM;数据个数
lea si,data;si指向data的首地址
L1:
mov al,[si]
CALL DISP
mov dl,',';以逗号分割数据
mov ah,2
int 21H
inc si
LOOP L1
CRLF
RET
SHOWDATA ENDP
code ends
end START
运行结果:
随机生成数据版
CRLF MACRO
MOV DL,0DH
MOV Ah,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM ;定义宏功能用于换行
STRSHOW MACRO buff;buff表示要显示字符串标号
mov dx,offset buff
mov ah,09H
int 21H
ENDM;定义宏功能用于显示字符串
;定义数据段
datas segment
;输出提示信息
MESS1 db 'before sort:',0DH,0AH,'$'
MESS2 db 'after sort:',0DH,0AH,'$'
;排序数据
data db 128 dup(?)
NUM EQU 50;排序数据个数
datas ends
;定义栈段
stack segment stack 'stack'
STA db 128 dup(?)
TOP EQU LENGTH STA
stack ends
code segment
ASSUME cs:code,ds:datas,ss:stack
START:;初始化相关寄存器
mov ax,datas
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,TOP
call Rand;调用Rand模块生成NUM个数据
STRSHOW MESS1;调用宏功能输出MESS1
call SHOWDATA;调用宏功能输出数据
mov cx,NUM
dec cx;外循环次数
outer:
mov dx,cx;内循环次数
lea bx,data;取data的偏移量
iner:
mov al,[bx]
cmp al,[bx+1];比较相邻数据大小
jna next;前小于后,继续排序过程
;前大于后,进行交换
xchg al,[bx+1]
mov [bx],al
next:
inc bx
dec dx
jnz iner
LOOP outer
STRSHOW MESS2;调用宏功能输出MESS2
call SHOWDATA;调用宏功能输出数据
mov ax,4c00h
int 21h
;将al中的数据以十六进制输出
DISP PROC
push ax
push cx
mov cl,4
ror al,cl;循环右移4位,取高4位
CALL TOASC;调用子程序输出字符
ror al,cl;循环右移4位,取低4位
CALL TOASC;调用子程序输出字符
pop cx
pop ax
RET
DISP ENDP
;辅助输出子程序
TOASC PROC
push ax
push bx
push dx
lea bx,ASCII;bx指向转化表
and al,0FH
xlat cs:ASCII;al<--cs:[bx+al]
;输出
mov dl,al
mov ah,2
int 21H
pop dx
pop bx
pop ax
RET
;子程序的数据区
ASCII db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h
db 41h,42h,43h,44h,45h,46h
TOASC ENDP
;输出data数据区的数据
SHOWDATA PROC
mov cx,NUM;数据个数
lea si,data;si指向data的首地址
L1:
mov al,[si]
CALL DISP
mov dl,',';以逗号分割数据
mov ah,2
int 21H
inc si
LOOP L1
CRLF
RET
SHOWDATA ENDP
;随机数生成子程序
Rand PROC
mov cx,NUM
lea si,data
L2:
mov ax,0ffh
mov dx,41h
out dx,ax ;产生从1到AX之间的随机数
in al,dx;产生的随机数AL
mov [si],al
inc si
loop L2
RET
Rand ENDP
code ends
end START
运行结果: