8086汇编排序(冒泡、选择、快速)
来源:互联网 发布:做项目计划软件 编辑:程序博客网 时间:2024/05/16 10:53
本代码通过测试,可通过masm查验
冒泡排序
DSEG SEGMENTSCORE DB 11H,02H,15H,32H,5H,6H,7H,8H,9H,10H,90 DUP(05H)MAX DB ?MIN DB ?DSEG ENDSCSEG SEGMENTASSUME DS:DSEG,CS:CSEGSTART: MOV AX, DSEGMOV DS, AX;————————————————到这,上面的均是模板LEA BX, SCORE ;取数组的首地址MOV CX, 100 ;控制循环次数XOR SI, SI ;将SI清零XOR DI, DI ;将DI清零 L1: MOV AH, [BX+SI] ;用基变址寻址取操作数,L1为外循环,(SI)为循环变量,;相当于i L2: MOV AL, [BX+DI] ;L2为内循环,(DI)为循环变量,相当于jCMP AH, ALJAE L3MOV DH, AH ;AH<Al,交换两个数MOV AH, ALMOV AL, DHMOV [BX+DI],AL ;将交换后的数存入存储器MOV [BX+SI],AH ;这两步很重要 L3: INC DI ;AH>=AL,不需交换,(AH)直接和后一个数比较,相当于j++CMP DI,100;判断内层循环是否结束JB L2 ;没结束,继续循环;内层循环结束了INC SI;外层变量SI加一,相当于i++MOV DI,SI;相当于j=iLOOP L1 ;通过寄存器实现两个存储器数据间的交换MOV AH,BYTE PTR[BX];基址寻址MOV AL,BYTE PTR[BX+99]MOV MAX,AHMOV MIN,ALMOV AH,4CH ;返回操作系统INT 21HCSEG ENDSEND START
选择排序
DATA SEGMENTarr DB 73H,54H,68H,21H,32H,45H,67H,87H,95H,99HDATA ENDSCODE SEGMENTASSUME CS : CODE, DS : DATASTART: PUSH DSXOR AX, AXPUSH AXMOV AX, DATAMOV DS, AXMOV CX, 9 ; 内层循环次数 MOV SI, OFFSET arr; SI游动下标XOR DI, SI ; DI记录最小数下标PUSH SILOOP1: INC SIMOV AL, [SI]CMP AL, [DI] JAE LOOP2 ;unsigned dataMOV DI, SI LOOP2:DEC CXJNZ LOOP1POP SIMOV AL, [DI]XCHG [SI], ALXCHG AL, [DI]INC SIMOV CX, 9SUB CX, SI MOV DI, SIPUSH SIJNZ LOOP1RETCODE ENDS END START
快速排序(不用内存辅助排序)
DATASEG SEGMENTDATABASE DW 9991H,9999H,9996H,9993H,9992H,9998H,9994H,9990H,9997H,8888HNUM DW 0014HDATASEG ENDSCODESEG SEGMENTASSUME CS : CODESEG, DS : DATASEGMAIN PROC FAR START :PUSH DSXOR AX,AXPUSH AX MOV AX,DATASEG MOV DS,AX MOV SI, OFFSET DATABASE ;EQUALENT: LEA SI DATABASE MOV DI, NUMSUB DI, TYPE DATABASE ;RIGHT BOUNDARYCALL QUICKSORT CALL DISP RETMAIN ENDPQUICKSORT PROC NEAR CMP SI,DIJNL END_QUICKSORT ; CONTINUE WHEN LEFT BOUNDARY < RIGHT BOUNDRYPUSH DI ; develer right boundary parameterPUSH SI ; develer left boundary parameter CALL QUICKPASS POP DI ; POP divid BOUNDARYPOP SI ; POP left BOUNDARYPUSH DI ; PUSH divid BOUNDARYSUB DI, TYPE DATABASE ; COPY LEFT-HALF MAX INDEX TO DICMP SI, DIJL IF_TO JNL ELSE_TO IF_TO: CALL QUICKSORT ; recursively call QuickSort ELSE_TO: POP SI ; POP divid BOUNDARYPOP DI ; POP RIGHT BOUNDARYADD SI, TYPE DATABASE ; COPY RIGHT-HALF MAX INDEX TO SICMP SI, DIJNL END_QUICKSORTCALL QUICKSORT ; recursively call QuickSort END_QUICKSORT : RET ; 43 LineQUICKSORT ENDPQUICKPASS PROC NEAR POP BX POP SIPOP DIPUSH DIPUSH SIMOV DX,WORD PTR[SI] ; STORE FIRAT VALUE AS DIVID BOUNDARY LOOP_OUT : CMP SI,DI ;50JNB END_QUICKPASS ; CONTINUE WHEN LEFT BOUNDARY < RIGHT BOUNDRY LOOP_IN1 : CMP SI,DILAHF ;LOAD FLAGS TO AHAND AH,01HCMP AH,01HJNE IGNORE_LOOP_IN1;57 Line CMP DX,WORD PTR[DI]LAHF ;LOAD FLAGS TO AHAND AH,41HCMP AH,0H JZ IGNORE_LOOP_IN1SUB DI,TYPE DATABASEJMP LOOP_IN1 IGNORE_LOOP_IN1: CMP SI,DI JNL LOOP_IN2 ;WHEN SI IS EQUAL TO DI ,SWAP DATA BETWWEN RAM IS MORE SLOWLY AND INVALID MOV AX, WORD PTR[DI]MOV [SI],AX LOOP_IN2: CMP SI,DILAHF ;LOAD FLAGS TO AHAND AH,01HCMP AH,01HJNE IGNORE_LOOP_IN2 CMP WORD PTR[SI],DXLAHF ;LOAD FLAGS TO AHAND AH,41H CMP AH,0H JZ IGNORE_LOOP_IN2ADD SI,TYPE DATABASEJMP LOOP_IN2 IGNORE_LOOP_IN2: CMP SI,DI ;WHEN SI IS EQUAL TO DI ,SWAP DATA BETWWEN RAM IS MORE SLOWLY AND INVALID JNL IGNORE_SWAP MOV AX,WORD PTR[SI] MOV [DI],AX IGNORE_SWAP:JMP LOOP_OUT END_QUICKPASS: MOV [SI],DX ;FIRST VALUE STORED INTO DIVID ADRRESS PUSH SI PUSH BX RETQUICKPASS ENDPDISP PROC NEARMOV BX, OFFSET DATABASE ; INITIAL LOOP CONTROL VARIABLELOOP_OUTER:CMP BX, NUMJNB END_OUTER_LOOPMOV BP, SPMOV AX, [BX]LOOP_IN:CMP AX, 00HJE LOOP_DISPMOV DX, 0000HMOV CX, 0AH DIV CXADD DL, 30HPUSH DXJMP LOOP_IN LOOP_DISP:CMP SP,BPJNB END_LOOP_DISPPOP DXMOV AH, 02HINT 21HJMP LOOP_DISPEND_LOOP_DISP:MOV DL, 20H ;SPACE ASCII VALUE :20HMOV AH, 02HINT 21HADD BX, TYPE DATABASEJMP LOOP_OUTEREND_OUTER_LOOP:RETDISP ENDPCODESEG ENDS END START
快速排序(用到内存辅助排序)
DATASEG SEGMENTDATABASE DW 9991H,9999H,9996H,9993H,9992H,9998H,9994H,9990H,9997H,8888HNUM DW 0014HDATASEG ENDSSTACKSEG SEGMENT 'STACK'DB 200H DUP(?)STACKSEG ENDSCODESEG SEGMENTASSUME CS : CODESEG, DS : DATASEG,SS : STACKSEGMAIN PROC FAR START : MOV AX,STACKSEGMOV SS,AXMOV SP,200HPUSH DSXOR AX,AXPUSH AX MOV AX,DATASEG MOV DS,AX ;MOV SI, OFFSET DATABASE ;EQUALENT: LEA SI DATABASE ;MOV DI, NUM;SUB DI, TYPE DATABASE ;RIGHT BOUNDARYCALL CALL_QUICK_SORT CALL DISP RETMAIN ENDP CALL_QUICK_SORT PROC NEARMOV SI, OFFSET DATABASE ;EQUALENT: LEA SI DATABASE MOV DI, NUMSUB DI, TYPE DATABASE ;RIGHT BOUNDARYCALL QUICKSORTRETCALL_QUICK_SORT ENDPQUICKSORT PROC NEAR CMP SI,DIJNL END_QUICKSORT ; CONTINUE WHEN LEFT BOUNDARY < RIGHT BOUNDRYPUSH DI ; develer right boundary parameterPUSH SI ; develer left boundary parameter CALL QUICKPASS POP DI ; POP divid BOUNDARYPOP SI ; POP left BOUNDARYPUSH DI ; PUSH divid BOUNDARYSUB DI, TYPE DATABASE ; COPY LEFT-HALF MAX INDEX TO DICMP SI, DIJL IF_TO JNL ELSE_TO IF_TO: CALL QUICKSORT ; recursively call QuickSort ELSE_TO: POP SI ; POP divid BOUNDARYPOP DI ; POP RIGHT BOUNDARYADD SI, TYPE DATABASE ; COPY RIGHT-HALF MAX INDEX TO SICMP SI, DIJNL END_QUICKSORTCALL QUICKSORT ; recursively call QuickSort END_QUICKSORT : RET ; 43 LineQUICKSORT ENDPQUICKPASS PROC NEAR POP BX POP SIPOP DIPUSH DIPUSH SIMOV DX,WORD PTR[SI] ; STORE FIRAT VALUE AS DIVID BOUNDARY LOOP_OUT : CMP SI,DI ;50JNB END_QUICKPASS ; CONTINUE WHEN LEFT BOUNDARY < RIGHT BOUNDRY LOOP_IN1 : CMP SI,DILAHF ;LOAD FLAGS TO AHAND AH,01HCMP AH,01HJNE IGNORE_LOOP_IN1;57 Line CMP DX,WORD PTR[DI]LAHF ;LOAD FLAGS TO AHAND AH,41HCMP AH,0H JZ IGNORE_LOOP_IN1SUB DI,TYPE DATABASEJMP LOOP_IN1 IGNORE_LOOP_IN1: CMP SI,DI JNL LOOP_IN2 ;WHEN SI IS EQUAL TO DI ,SWAP DATA BETWWEN RAM IS MORE SLOWLY AND INVALID MOV AX, WORD PTR[DI]MOV [SI],AX LOOP_IN2: CMP SI,DILAHF ;LOAD FLAGS TO AHAND AH,01HCMP AH,01HJNE IGNORE_LOOP_IN2 CMP WORD PTR[SI],DXLAHF ;LOAD FLAGS TO AHAND AH,41H CMP AH,0H JZ IGNORE_LOOP_IN2ADD SI,TYPE DATABASEJMP LOOP_IN2 IGNORE_LOOP_IN2: CMP SI,DI ;WHEN SI IS EQUAL TO DI ,SWAP DATA BETWWEN RAM IS MORE SLOWLY AND INVALID JNL IGNORE_SWAP MOV AX,WORD PTR[SI] MOV [DI],AX IGNORE_SWAP:JMP LOOP_OUT END_QUICKPASS: MOV [SI],DX ;FIRST VALUE STORED INTO DIVID ADRRESS PUSH SI PUSH BX RETQUICKPASS ENDPDISP PROC NEARMOV BX, OFFSET DATABASE ; INITIAL LOOP CONTROL VARIABLELOOP_OUTER:CMP BX, NUMJNB END_OUTER_LOOPMOV BP, SPMOV AX, [BX]LOOP_IN:CMP AX, 00HJE LOOP_DISPMOV DX, 0000HMOV CX, 0AH DIV CXADD DL, 30HPUSH DXJMP LOOP_IN LOOP_DISP:CMP SP,BPJNB END_LOOP_DISPPOP DXMOV AH, 02HINT 21HJMP LOOP_DISPEND_LOOP_DISP:MOV DL, 20H ;SPACE ASCII VALUE :20HMOV AH, 02HINT 21HADD BX, TYPE DATABASEJMP LOOP_OUTEREND_OUTER_LOOP:RETDISP ENDPCODESEG ENDS END START
0 0
- 8086汇编排序(冒泡、选择、快速)
- 快速,冒泡,选择排序
- 冒泡,选择,快速排序
- 选择,冒泡,快速排序
- 冒泡,选择,快速排序
- 冒泡、选择、快速排序
- 排序-冒泡,快速(选择排序)
- 排序总结(冒泡、选择、插入、快速)
- 常用排序(冒泡、快速、选择)
- 排序(冒泡、选择、插入、快速)
- 排序算法(冒泡、选择、插入、快速)
- 算法排序(冒泡、选择、插入、快速)
- PHP(冒泡,快速,选择,插入)排序
- 排序算法(冒泡、快速、选择、插入)
- 排序算法(冒泡、快速、选择、插入)
- 冒泡排序,选择排序,插入排序,快速排序(PHP)
- 【排序】快速排序 冒泡排序 选择排序
- 选择排序,冒泡排序,快速排序(从小到大)
- 设计模式(22)-行为型模式-Template Method模式
- OCP 1Z0 051 165
- 程序员的奋斗史(三十八)——大学断代史(二)——我与数据库的故事
- iOS中集合遍历方法的比较和技巧
- 学会查看错误日志!!!
- 8086汇编排序(冒泡、选择、快速)
- 设计模式(23)-行为型模式-VISITOR模式
- POJ2983 查分约束系统
- Cross-site scripting with UTF-7
- Mina源码阅读笔记(四)—Mina的连接IoConnector1
- TCP/IP详解卷一 第四章 ARP地址解析协议 第五章 RARP反向地址解析协议
- hdu 1166 敌兵布阵 线段树
- JAVA实现DES加密
- Mina源码阅读笔记(四)—Mina的连接IoConnector2