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
原创粉丝点击