史上最牛最完整的汇编语言冒泡排序程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;题目:体例一个完备的汇编谈话步调,从键盘上读进若搞个(不妨超出十个)十进造数(正数),排序后正在屏幕上输出. 之阳早格格创做
;采与冒泡法排序,概括使用子步调战宏汇编,使步调模块化. ;步调代码
M_DIRECT MACRO STRING ;定义一个宏,调用09号DOS功能正在屏幕上隐现一个字符串
MOV DX,OFFSET STRING
MOV AH,09
INT 21H
ENDM
DATA SEGMENT
DIR1 DB 'count of numbers to sort:$ ' ;提示输进要排序的数据的个数
DIR2 DB 'please input sorting numbers:$ ';提示输进要排序的数据
DIR3 DB 'sorting result:$ ' ;正在屏幕上提示排佳绝的数据
DIR4 DB
'*************************$ '
DIR5 DB 'please choose u(up)ord(down):$ '
DIR6 DB 'input error$ '
COUNT = 100
WTEMP DW ?
ARRAY DW COUNT DUP(?) ;用去保存输进的数据
CRLF DB 13,10, '$ ' ;真止回车换止的功能,13→0DH,回车;10→0AH,换止
LEN
DW ?
;保存本质输进的数据的个数
DATA ENDS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODE SEGMENT
MAIN PROC FAR
ASSUME
CS:CODE,DS:DATA
START:
PUSH DS
SUB
AX,AX ;置AX为0
PUSH AX
MOV
AX,DATA ;将数据段的天点收到DX中
MOV DS,AX
READ: M_DIRECT DIR1 ;宏调用,正在屏幕上提示输进要输进的数据的个数
CALL
P_GETNEW ;调用子步调P-GETNEW,输进要输进的数据的个数
MOV CX,AX
MOV LEN,AX
LEA BX,ARRAY
MOV
AH,09 ;调用09号功能,真止回车换止
LEA DX,CRLF
INT
21H ;屏幕提示输进要排序的数据
M_DIRECT
DIR2
GETNUMBER: CALL P_GETNEW ;输进数据并保存到ARRAY中
MOV [BX],AX
ADD BX ,2
LOOP GETNUMBER SORT: MOV CX,LEN ;排序步调部分
DEC CX
MOV AH,09H
LEA DX,CRLF
INT 21H
M_DIRECT DIR5
COMPARE:MOV AH,01H
INT 21H
CMP AL, 'U' ;推断是降序排序仍旧落序排

JZ
UP ;输进的字符是U或者u 跳转到降序排序步调
CMP AL, 'u'
JZ UP
CMP AL, 'D' ;输进的字符是D或者d跳转到落道排序步调
JZ DOWN
CMP AL, 'd'
JZ DOWN
UP: MOV DI,CX ;降序排序步调
MOV BX,0
LOOP1: MOV AX,ARRAY[BX]
CMP
AX,ARRAY[BX+2]
JNGE CONTINUE1
XCHG
AX,ARRAY[BX+2]
MOV
ARRAY[BX],AX
CONTINUE1: ADD BX,2
LOOP LOOP1
MOV CX,DI
LOOP UP
JMP
OUTPUT ;排序完后跳转到输出步调部分
DOWN: MOV DI,CX ;落序排序步调
MOV BX,0
LOOP2: MOV AX,ARRAY[BX]
CMP
AX,ARRAY[BX+2]
JGE CONTINUE2
XCHG
AX,ARRAY[BX+2]
MOV
ARRAY[BX],AX
CONTINUE2: ADD BX,2
LOOP LOOP2
MOV CX,DI
LOOP DOWN
JMP
OUTPUT ;排序完后跳转到输出步调部分
OUTPUT: MOV AH,09 ;回车换止
LEA DX,CRLF
INT 21H
M_DIRECT
DIR3
MOV
CX,LEN ;为输出步调树立佳出心参数
MOV BX,OFFSET ARRAY
WRITE: MOV AX,[BX] ;输出排佳序的数据
MOV
WTEMP,AX ;将出心参数存搁到同享变量中
CALL P_OUTPUT
ADD BX,2
MOV
DL,20H ;隐现空格,将二个输出的数据分启
MOV AH,02H
INT 21H
LOOP WRITE
MOV
AH,09 ;断绝二次输进排序输出的效率
LEA DX,CRLF
INT 21H
M_DIRECT
DIR4
MOV
AH,09 ;真止循环输进数据并排序输出
LEA DX,CRLF
INT 21H
LOOP READ
RET
MAIN ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;从键盘上输进一个数据的子步调;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
P_GETNEW PROC
PUSH
BX ;出心参数:AX=补码表示的二进造数
PUSH
CX ;证明:背数用“-”带领,数据范畴是+32767~-32768
PUSH DX
XOR
BX,BX ;BX保存截止
XOR
CX,CX ;CX为正背标记,0为正,-1为背
MOV
AH,1 ;输进一个字符
INT 21H
CMP AL, '+' ;是“+”,继承输进字符
JZ READ1
CMP AL, '-' ;是“—,树立-1标记
JNZ READ2
MOV CX,-1
READ1: MOV AH,1 ;继承输进字符
INT 21H
READ2: CMP AL, '0' ;没有是0~9之间的字符,则输进数据中断
JB READ3
CMP AL, '9'
JA READ3
SUB
AL,30H ;是0~9之间的字符,则变换为二进造数
;利用移位指令,真止数值乘10:BX←BX*10
SHL BX,1
MOV DX,BX
SHL BX,1
SHL BX,1
ADD BX,DX
MOV AH,0
ADD
BX,AX ;已输进数值乘10后,与新输进的数值相加
JMP
READ1 ;继承输进字符
READ3: CMP CX,0 ;是背数,举止供补
JZ READ4
NEG BX
READ4: MOV AX,BX ;树立出心参数
POP DX
POP CX
POP BX
RET ;子步调返回
P_GETNEW ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;用冒泡法排序的子步调(从大到小);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;P_SORT PROC
;RET
;子步调返回
;P_SORT ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;数据输出子步调;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
P_OUTPUT PROC
PUSH AX ;出心参数:同享变量WTEMP
PUSH BX
PUSH DX
MOV AX,WTEMP ;与出隐现的数据
TEST AX,AX ;推断数据是整、正书籍仍旧背数
JNZ WRITE1
MOV DL, '0' ;是‘0’,隐现‘0’退却出
MOV AH,2
INT 21H
JMP WRITE5
WRITE1: JNS WRITE2 ;是
背数,隐现“-”
MOV
BX,AX ;AX数据久存于BX
MOV DL, '-'
MOV AH,2
INT 21H
MOV AX,BX
NEG
AX ;数据供补(千万于值)
WRITE2: MOV BX,10
PUSH
BX ;10压进堆栈,搞为推退出标记WRITE3: CMP AX,0 ;数据(商)为整,转背隐现
JZ WRITE4
SUB DX,DX ;扩展被除数DX.AX
DIV
BX ;数据除以10
ADD DL,30H ;余数(0~9)变换为ASCⅡ码
PUSH
DX ;数据诸位先矮位后下位压进堆栈
JMP WRITE3
WRITE4: POP DX ;数据诸位先下位后矮位弹出堆栈
CMP DL,10 ;是中断标记10,则退出
JE WRITE5
MOV
AH,2 ;举止隐现
INT 21H
JMP WRITE4
WRITE5: POP DX
POP BX
POP AX
MOV DL,20H
MOV AH,02H
INT 21H
RET ;子步调返回
P_OUTPUT ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODE ENDS
END START。

相关文档
最新文档