📄 汇编实现输输数 排序 显示.txt
字号:
源程序代码如下: (附注释)
.model small ;define memory model
.stack 16 ;define stack segment
.data ;define data segment
SPACE DB 1000 DUP (' ') ;定义一个空格,并重复一千次
PATTERN db 'byebye bye bye byebyebyebye' ;定义字符串
db 'bye bye bye bye bye '
db 'bye bye bye bye '
db 'byebye bye byebyebye '
db 'bye bye bye bye '
db 'bye bye bye bye '
db 'byebye bye byebyebyebye'
zhou1 db 0dh,0ah,'the number you have input is:','$' ;定义回车,换行,和字符串
zhou2 db 0dh,0ah,'the average of the array is:','$' ;定义回车,换行,和字符串
keyorder db 0dh,0ah,'1 key : order the array from max to min',0dh,0ah
db '2 key : turn the array from min to max',0dh,0ah
db '3 key : show the numbers you have input',0dh,0ah
db 'z key : get the average',0dh,0ah
db 'x key : get the time',0dh,0ah
db 'c key : exit',0dh,0ah
db 'xingming: meng jian hua',0dh,0ah
db 'xuehao:0905050607',0dh,0ah
db 'banji:tongxin0506','$' ;设计屏幕界面显示(一系列字符串)
enter db 0dh,0ah,'please enter the arrary:',0dh,0ah,'$' ;定义字符串,回车,换行
pwait db 'wait for a second please',0dh,0ah,'$' ;定义字符串,回车,换行
disp db 'result is below',0dh,0ah,'$' ;定义字符串,回车,换行
;---------------------------------
nub db 0
buf db 10 dup (?) ;定义10个存储空间用于存储数据
DBUFFER DB 8 DUP (':') ;定义冒号并重复8次
aver db 0
.code ;define code segment
org 100h ;伪指令,定义起始地址为100h
;---------------------------------------------------
;主过程
main proc near ;main part of program
mov ax,@data;数据段附加段初始化
mov ds,ax
mov es,ax
MOV AX,0001H ;(ah)=00h
INT 10H ;设置显示方式,(al=01h) 40*25 16色文本
;------------------------------------------
;初始化程序
MOV BP,OFFSET SPACE ;得到SPACE的便宜地址,存入基址指针寄存器
MOV DX,0B00H ;dh/dl=起始行/列
MOV CX,1000 ;(ch)=字符串长度
MOV BX,00c0H ;页号以及背景颜色和字体颜色的设置
MOV AX,1300H ;(ah)=13h
INT 10H ;显示字符串
;------------------
;将buf中的所有空间清零以便后面跳回来
back: mov cx,000ah
lea bx,buf ;取得buf的偏移地址
mov al,00h ;把00h赋给al用于后面清零
loop1: mov [bx],al
inc bx
loop loop1 ;所有存储空间全部清零
;------------------
mov ah,09h ;显示字符串
lea dx,keyorder ;取得keyorder的偏移地址
int 21h ;显示keyorder标号处定义的字符串
keyin: mov ah,02h ;显示输出
mov dl,0dh
int 21h ;输出回车
mov ah,02h
mov dl,0ah
int 21h ;输出换行
mov ah,01h ;键盘输入并回显
int 21h
;把从键盘输入的数与1,2,3,z,c,x进行比较
cmp al,'1'
je maxtomin ;如果输入的是1则跳转到maxtomin
cmp al,'2'
je mintomax ;如果输入的是2则跳转到mintomax
cmp al,'3'
je shownub ;如果输入的是3则跳转到shownub
cmp al,'z'
je showaver ;如果输入的是z则跳转到showzver
cmp al,'c'
je byebye ;如果输入的是c则跳转到byebye
cmp al,'x'
je gettime ;如果输入的是x则跳转到gettime
jmp keyin ;子程序调用结束后重新从键盘输入数据
showaver:
call showaverp ;调用求平均值子程序
jmp back ;返回到back
shownub:
call shownubp ;调用求输入数字的个数子程序
jmp back ;返回到back
maxtomin:
call maxtominp ;调用从大到小排序子程序
jmp back ;返回到back
mintomax:
call mintomaxp ;调用从小到大排序子程序
jmp back ;返回到back
gettime:
call TIME ;调用系统时间子程序
jmp back ;返回到back
;---------------------------------------------------
byebye: mov ah,09h
int 21h
MOV BP,OFFSET PATTERN ;取得PATTERN的偏移地址,存入基址指针寄存器
MOV DX,0B00H ;dh/dl=起始行/列
MOV CX,280 ;(ch)=字符串长度
MOV BX,005EH ;页号以及背景颜色和字体颜色的设置
MOV AX,1301H ;(ah)=13h
INT 10H ;显示字符串
MOV AH,02H ;(ah)=02h
MOV DX,1801H ;dh/dl=行/列
MOV BH,0 ;定义页号
INT 10H ;置光标位置
mov ax,4c00h ;(ah)=4ch
int 21h ;带返回码中止,(al)=返回码
main endp
;---------------------------------------------------
;接受数据子过程
rec proc near
mov di,0 ;附加段偏移地址为0
lea bx,buf ;取得buf的偏移地址
newchar: mov ax,0100h ;(ah)=01h
int 21h ;调用输入中断
;输入的字符于空格,回车,和数值进行比较
cmp al,20h
je save ;输入的是空格则跳到保存数据save
cmp al,0dh
je exit ;输入的是回车则跳出子过程
sub al,30h ;输入数据则转换成16进制
xchg al,dl ;交换al与dl,即(al)清零
mov cl,0ah ;(cl)=0ah
mul cl ;(ax)=(al)*(cl)
xchg al,dl
add dl,al
jmp newchar ;跳回输入
save: inc ch
mov [bx],dl
add di,word ptr [bx]
inc bx
mov dx,0000h
jmp newchar
exit: inc ch
mov [bx],dl
add di,word ptr [bx]
mov ax,di
div ch
mov aver,al
mov [aver+1],ah
mov ah,02h
mov dl,0ah
int 21h
mov nub,ch
xor ch,ch
ret
rec endp
;-----------------------------------------
;排序子过程
paixu proc near
MOV Cl,nub
mov ch,0
one: lea bx,buf
PUSH CX
two: MOV AX,[BX]
CMP AL,AH
JC four
three: INC BX
LOOP two
POP CX
LOOP one
ret
four: XCHG AL,AH
MOV [BX],AX
JMP three
paixu endp
;----------------------------------------------------
paixu2 proc near
MOV Cl,nub
mov ch,0
one2: lea bx,buf
PUSH CX
two2: MOV AX,[BX]
CMP AL,AH
Jae four2
three2: INC BX
LOOP two2
POP CX
LOOP one2
ret
four2: XCHG AL,AH
MOV [BX],AX
JMP three2
paixu2 endp
;----------------------------------------------------
;把buf的内容按10进制显示
disply proc near
mov cx,10 ;循环10次
lea bx,buf
loop2: mov al,[bx]
cmp al,0 ;是0就不必考虑了
je isz
;是小与9的数字就不要考虑100与10位的数字
cmp al,9
jbe only0
jmp next
only0: mov ah,al
jmp only1
next: mov ah,00h
;--------------------------
;百位数输出
mov dh,100
div dh
push ax
add al,30h
mov ah,02h
mov dl,al
cmp dl,30h;为0跳过输出
je a1
int 21h
;--------------------------
;十位数输出
a1: pop ax
xchg ah,al
and ax,00ffh
mov dh,10
div dh
push ax
add al,30h
mov ah,02h
mov dl,al
int 21h
;---------------------------
;个位数输出
a2: pop ax
only1: add ah,30h
mov dl,ah
mov ah,02h
int 21h
;---------------------------
mov ah,02h
mov dl,' '
int 21h
isz: inc bx
and ax,0000h;对ax清零
loop loop2
ret
disply endp
;----------------------------------
showaverp proc near
mov ah,09h
lea dx,zhou2
int 21h
mov dl,aver
mov al,dl
cmp al,9 ;如果al小于等于9,则跳转
jbe only0p
jmp nextp ;如果al小于等于9,则跳转
only0p: mov ah,al
jmp only1p
nextp: mov ah,00h
;--------------------------
;百位数输出
mov dh,100
div dh
push ax
add al,30h
mov ah,02h
mov dl,al
cmp dl,30h;为0跳过输出
je a1p
int 21h
;--------------------------
;十位数输出
a1p: pop ax
xchg ah,al
and ax,00ffh
mov dh,10
div dh
push ax
add al,30h
mov ah,02h
mov dl,al
int 21h
;---------------------------
;个位数输出
a2p: pop ax
only1p: add ah,30h
mov dl,ah
mov ah,02h
int 21h
;---------------------------
mov ah,02h
mov dl,' '
int 21h
iszp: and ax,0000h ;对ax清零
ret
showaverp endp
;------------------------------------
shownubp proc near
mov ah,09h
lea dx,zhou1
int 21h
mov ah,02h
mov dl,nub
add dl,30h
int 21h
ret
shownubp endp
;------------------------------------
mintomaxp proc near
mov ax,0900h ;提示输入
lea dx,enter
int 21h
;------------------
mov dl,00h
call rec ;调用接收子过程
;------------------
mov dx,offset pwait
mov ax,0900h ;提示等待
int 21h
;------------------
call paixu2 ;调用排序子过程
;-------------------
mov ax,0900h ;提示输出正确顺序
lea dx,disp
int 21h
call disply
;-------------------
mov ah,02h
mov dl,0dh
int 21h
mov ah,02h
mov dl,0ah
int 21h ;回车换行
;-------------------
ret
mintomaxp endp
maxtominp proc near
mov ax,0900h ;提示输入
lea dx,enter
int 21h
;------------------
mov dl,00h
call rec ;调用接收子过程
;------------------
mov dx,offset pwait
mov ax,0900h ;提示等待
int 21h
;------------------
call paixu ;调用排序子过程
;-------------------
mov ax,0900h ;提示输出正确顺序
lea dx,disp
int 21h
call disply
;-------------------
mov ah,02h
mov dl,0dh
int 21h
mov ah,02h
mov dl,0ah
int 21h ;回车换行
;-------------------
ret
maxtominp endp
;-------------------
;显示时间子程序
TIME PROC NEAR
DISPLAY1:MOV SI,0
MOV BX,100
DIV BL
MOV AH,2CH ;取时间
INT 21H
MOV AL,CH
CALL BCDASC ;将时间换成ASCII码
INC SI
MOV AL,CL
CALL BCDASC
INC SI
MOV AL,DH
CALL BCDASC
MOV BP,OFFSET DBUFFER
MOV DX,180DH
MOV CX,8
MOV BX,004EH
MOV AX,1301H
INT 10H
MOV AH,02H
MOV DX,1801H
MOV BH,0
INT 10H
MOV BX,0018H
RE: MOV CX,0FFFFH
REA: LOOP REA
DEC BX
JNZ RE
MOV AH,01H
INT 16H
JE DISPLAY1
JMP back
MOV AX,4C00H
INT 21H
RET
TIME ENDP
BCDASC PROC NEAR ;时间换成ASCII码
PUSH BX
CBW
MOV BL,10
DIV BL
ADD AL,'0'
MOV DBUFFER[SI],AL
INC SI
ADD AH,'0'
MOV DBUFFER[SI],AH
INC SI
POP BX
RET
BCDASC ENDP
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -