汇编语言输入10个数排序并输出的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语⾔输⼊10个数排序并输出的实现⼀:题⽬描述
在键盘输⼊任意10个数
1. 按从⼩到⼤排序后,在计算机屏幕上先输出来。
要有结果提⽰(字符串显⽰)。
2. 将10个数做累加,结果在计算机屏幕显⽰累加和。
⼆:伪指令的定义
1.数据段
ATAS SEGMENT
string_1 DB 'Please input a numbers(0-65536):','$'
string_2 DB 'ERROR: OVERFLOW! Please input again:','$'
string_3 DB 'The array you have input is:',0ah,0dh,'$'
string_4 DB 'After Sort the num is:',0ah,0dh,'$'
string_5 DB ' ','$'
DATA DW 10 DUP(?)
massege DB 'The sum of the array is: ',0ah,0DH,'$'
DATAS ENDS
说明:
string_1输⼊范围提⽰
string_2输⼊错误提⽰
string_3输出原数组提⽰
string_4输出排序后数组提⽰
string_5空格符
DATA缓冲区数组
2.堆栈段
STACKS SEGMENT
DW 256 dup(?)
STACKS ENDS
3.代码段
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
三:模块分解与实现
1. DOS输⼊10个数字
输⼊10个⽆符号数存⼊缓冲区,并且保证 num<65536num < 65536num<65536
为何输⼊范围是65536呢⼀个字的最⼤表⽰范围是 FFFFFFFFFFFF 其在⼗进制的表⽰下为 65535
HEX FFFF
DEC65535
BIN1111 1111 1111 1111
1.1 输⼊函数⼦程序
;---------输⼊函数(单数字输⼊)------------
Input PROC Near
push AX
push BX
push CX
push DX
;---------输⼊提⽰--------------
MOV BX, 0
CLC
MOV DX, 0
;----------输⼊数字--------------
Lp_0:
MOV AH, 1
INT 21H
CMP AL, 20H ;回车
JE L_CRLF
;----- x belong to [0,9] ----------
SUB AL, 30H ; ASCII -> int
JL L_ERROR
CMP AL, 9
JG L_ERROR
;------- string -> int -----------
MOV AH, 0 ;将 AL扩展成 AX
XCHG AX, BX ;保护 AX值
MOV CX, 10
MUL CX ; bx *= 10
ADD AX , BX
JC L_ERROR ; OVERFLOW处理
XCHG AX, BX
JMP Lp_0
L_ERROR:
MOV DX, 0
MOV BX, 0
CALL CRLF ; 换⾏
CALL ERROR ; 输出错误提⽰
JMP Lp_0
L_CRLF: ; 以换⾏作为⼀个数的结束标志
MOV DX, 0
MOV DATA[SI], BX ;
解析函数功能:
本质类似于⾼精度计算,将读⼊的⼀个串转成数字存储在DATA数组中
分成三⼤部分
⼀:输⼊提⽰
⼆:错误判断及提⽰
三:转化为数字
L_ERROR 错误处理
L_CRLF 结束处理
我们来举⼀个123412341234 的例⼦
Register1234
AX1234
BX0112123
CX10101010
AX+(BX∗CX)AX + (BX * CX)AX+(BX∗CX)
最后将结果存储在DATA数组⾥
2.实现冒泡排序
冒泡排序作为⼀个简单的排序算法,时间复杂度 O(n2)O(n^2)O(n2) 需要两层循环,为了提⾼代码的可读性,我们将内层的循环写成⼀个⼦程序每次调⽤内层循环很简单,每次从头⽐到尾,遇到⽐它⼩的交换就可以了。
因为是字操作数,所以循环的下标到18为结束条件。
;---------Bubble_sort--------------------
Bubble_sort PROC NEAR
PUSH BX
PUSH DX
MOV SI,DI
LOOP1:
ADD SI,2
MOV BX,DATA[DI]
CMP BX,DATA[SI]
JA SWAP
JMP NEXT
SWAP:
MOV DX,DATA[SI]
MOV DATA[DI],DX
MOV DATA[SI],BX
NEXT:
CMP SI,18
JL LOOP1
POP DX
POP BX
RET
Bubble_sort ENDP
外层调⽤:每次DI+2DI + 2DI+2
;----------Sort-----------
MOV CX, 9
MOV DI, 0
FOR1:
CALL Bubble_sort
ADD DI, 2
LOOP FOR1
3.DOS输出到屏幕
CALL CRLF
MOV DX, OFFSET string_4 ;'After Sort the num is:'
MOV AH, 9
INT 21H
MOV CX, 10
MOV DI, 0
FOR2:
CALL Print
CALL Space
ADD DI , 2
LOOP FOR2
CALL CRLF
输出DATA内的数字,每次输出⼀个数字然后在输出⼀个空格
Print函数:
1. 利⽤DIV函数的特点——每次除10的商放在AX,余数放⼊DX
2. 并利⽤栈的 FILO(First in Last Out)的特点
依旧以1234的例⼦来看⼀下是怎么处理的
DATA[Num]1234123121
DX4321
Stack(PUSH DX)44,34,3,24,3,2,1
Print(POP DX)4342341234
PUSH DX
MOV CX, 0
MOV BX, 10
MOV AX, DATA[DI]
LAST:
MOV DX, 0
DIV BX ; DIV商放AX,余数放⼊DX
PUSH DX
INC CX
CMP AX, 0
JNZ LAST
AGE:
POP DX
OR DX, 30H
MOV AH, 2
INT 21H
LOOP AGE
POP DX
POP CX
POP BX
POP AX
RET
Print ENDP
4.求累加和全部累加到DATA[0]DATA[0]DATA[0] 上直接调⽤ Print 函数,因为Print函数是针对DATA数组设计的,所以把最后的结果存⼊DATA数组中不需要额外的输出函数。
;-------SUM-------------
Get_sum PROC NEAR
PUSH BX
PUSH CX
MOV BX, 0
MOV CX , 9
MOV DI, 2
LOP1:
MOV BX, DATA[0]
ADD BX, DATA[DI]
MOV DATA[0], BX
ADD DI , 2
LOOP LOP1
POP CX
POP BX
RET
Get_sum ENDP
5.其他函数
;----换⾏⼦函数(⼀个数输⼊完毕)-------
CRLF PROC Near
push AX
push DX
MOV DL, 0ah
MOV AH, 2
INT 21H
pop DX
pop AX
RET
CRLF ENDP
;---------空格-----------
Space PROC Near
push AX
push DX
MOV DX, OFFSET string_5 ;' '
MOV AH, 9
INT 21H
pop DX
pop AX
RET
Space ENDP
;----------错误提⽰-------------
ERROR PROC Near
push BX
push DX
MOV DX, OFFSET string_2 ; ERROR: OVERFLOW! Please input again:
MOV AH, 9
INT 21H
pop DX
pop BX
RET
ERROR ENDP
四:流程图
1. 总体流程图
2. ⼦程序流程图2.1 Input
2.2 Print
2.4 Get_Sum
五:代码与运⾏截图
1,完整版代码(在MASM运⾏通过)
;-----数据段------------
DATAS SEGMENT
string_1 DB 'Please input 10 numbers(0-65536):','$'
string_2 DB 'ERROR: OVERFLOW! Please input again:','$'
string_3 DB 'The array you have input is:',0ah,0dh,'$'
string_4 DB 'After Sort the num is:',0ah,0dh,'$'
string_5 DB ' ','$'
DATA DW 10 DUP(?)
massege DB 'The sum of the array is: ',0ah,0DH,'$'
DATAS ENDS
;-----堆栈段------------
STACKS SEGMENT
DW 256 dup(?)
STACKS ENDS
;-----代码段------------
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
;-----------程序开始------------
START:
MOV AX,DATAS
MOV DS,AX
MOV SI, 0 ;指针初始化
MOV CX, 10 ;循环次数
;---------Input----------
MOV DX, OFFSET string_1 ;Please input 10 numbers(0-65536) MOV AH, 9
INT 21H
Lp:
CALL Input
ADD SI, 2
Loop Lp
;--------结束输⼊,换⾏---------------
CALL CRLF
MOV DX, OFFSET string_3 ;'The array you have input is:'
MOV AH, 9 ;⾸地址 DS:DX
INT 21H
;-------输出 ----------------
MOV CX, 10
MOV DI, 0
Again:
CALL Print
CALL Space
ADD DI , 2
Loop Again
;/******************************/
;----------Sort-----------
MOV CX, 9
MOV DI, 0
FOR1:
CALL Sort
ADD DI, 2
LOOP FOR1
CALL CRLF
MOV DX, OFFSET string_4 ;'After Sort the num is:'
MOV AH, 9
INT 21H
ADD DI , 2
LOOP FOR2
CALL CRLF
;-------求和输出---------------------
MOV DX, OFFSET massege;
MOV AH, 9
INT 21H
CALL Get_sum
MOV DI, 0
CALL Print
EXIT:
MOV AH, 4CH
INT 21H
;/************⼦程序调⽤****************/
;---------输⼊函数(单数字输⼊)------------
Input PROC Near
push AX
push BX
push CX
push DX
MOV BX, 0
CLC
MOV DX, 0
;----------输⼊数字--------------
Lp_0:
MOV AH, 1
INT 21H
CMP AL, 20H ;空格
JE L_CRLF
;----- x belong to [0,9] ----------
SUB AL, 30H ; ASCII -> int
JL L_ERROR
CMP AL, 9
JG L_ERROR
;------- string -> int -----------
MOV AH, 0 ;将 AL扩展成 AX
XCHG AX, BX ;保护 AX值
MOV CX, 10
MUL CX ; bx *= 10
ADD AX , BX
JC L_ERROR ; OVERFLOW处理
XCHG AX, BX
JMP Lp_0
L_ERROR:
MOV DX, 0
MOV BX, 0
CALL CRLF ; 换⾏
CALL ERROR ; 输出错误提⽰
JMP Lp_0
L_CRLF: ; 以换⾏作为⼀个数的结束标志
MOV DX, 0
MOV DATA[SI], BX ;
POP DX
POP CX
POP BX
POP AX
RET
Input ENDP
;----换⾏⼦函数(⼀个数输⼊完毕)-------
CRLF PROC Near
push AX
push DX
MOV DL, 0ah
MOV AH, 2
INT 21H
pop DX
pop AX
RET
CRLF ENDP
;---------空格-----------
Space PROC Near
push AX
push DX
MOV DX, OFFSET string_5 ;' '
MOV AH, 9
INT 21H
pop DX
pop AX
RET
Space ENDP
;----------错误提⽰-------------
ERROR PROC Near
push BX
push DX
MOV DX, OFFSET string_2 ; ERROR: OVERFLOW! Please input again: MOV AH, 9
INT 21H
pop DX
pop BX
RET
ERROR ENDP
;---------输出函数(单数字输出)-------------
MOV CX, 0
MOV BX, 10
MOV AX, DATA[DI]
LAST:
MOV DX, 0
DIV BX ; DIV商放AX,余数放⼊DX PUSH DX
INC CX
CMP AX, 0
JNZ LAST
AGE:
POP DX
OR DX, 30H
MOV AH, 2
INT 21H
LOOP AGE
POP DX
POP CX
POP BX
POP AX
RET
Print ENDP
;---------SORT---------------------
SORT PROC NEAR
PUSH BX
PUSH DX
MOV SI,DI
LOOP1:
ADD SI,2
MOV BX,DATA[DI]
CMP BX,DATA[SI]
JA CHANGE
JMP NEXT
CHANGE:
MOV DX,DATA[SI]
MOV DATA[DI],DX
MOV DATA[SI],BX
NEXT:
CMP SI,18
JL LOOP1
POP DX
POP BX
RET
SORT ENDP
;-------SUM-------------
Get_sum PROC NEAR
PUSH BX
PUSH CX
MOV BX, 0
MOV CX , 9
MOV DI, 2
LOP1:
MOV BX, DATA[0]
ADD BX, DATA[DI]
MOV DATA[0], BX
ADD DI , 2
LOOP LOP1
POP CX
POP BX
RET
Get_sum ENDP
CODES ENDS
END START
2. 正确运⾏时截图
3. 错误输⼊时截图
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。