8086汇编自娱自乐

来源:互联网 发布:决对争锋网络剧资源 编辑:程序博客网 时间:2024/06/16 22:41

微机原理与接口技术学习留下的一些小模块汇编,模块均有测试成功

;macro template;brief : output a new line on diplay device;note  : null;date  : 2013/11/26;author: @brtNEW_LINE MACRO MOV     DL, 0AHMOV     AH, 02HINT     21HENDM;macro template;brief : output a ENTER key on diplay device;note  : null;date  : 2013/11/26;author: @brtENTER_KEY   MACRO MOV     DL, 0AHMOV     AH, 02HINT     21HENDM;sub-procedure template;brief : dispay the value of AX,AX = ((DX):(AX)) / 10;  DX = ((DX):(AX)) % 10;note  : only display 16 bit width number,you can modify defined OBUF variable bit width according to your need ;date  : 2013/11/26;author: @brtDATA  SEGMENTOBUF  DB  06H DUP (?) ;  DATA ENDSDISP_NUM PROC NEARMOV  BX, OFFSET OBUF+6-1MOV  BYTE PTR [BX],'$'MOV  CX, 0AH;LOOP_NUM:;just like do{....}while(ax != 0)MOVDX, 00H  DIV  CXADD  DL, 30H;number value convert to ASCIIDEC  BXMOV  [BX], DLOR   AX, AXJNZ  LOOP_NUM;check AX is 0MOV  DX, BX      ;BX : start index of numberMOV  AH, 09HINT  21H RETDISP_NUM ENDP;brief : get a number what user input;note  : only input 6 bit width number,you can modify defined IBUF variable bit width according to your need ;date  : 2013/11/26;author: @brtDATA  SEGMENTIBUFDB  06H,         ;MAX NUMER OF CHARACTERS    00H,         ;VALID NUMBER OF CHARACTERS    06H DUP(?)   ;INPUT BUFFERDATA ENDSGET_NUM PROC NEARPUSH    DXPUSH    BXPUSH    CXPUSH    SIMOV  DX, OFFSET INF1;MOV  AH, 09HINT  21HMOV  DX, OFFSET IBUF;键入一个十进制数(<361)MOV  AH, 0AH     INT  21HMOV  CL, IBUF+1;十进制数的位数送CXMOV  CH, 0MOV  SI, OFFSET IBUF+2;指向输入的第一个字符(最高位)MOV  AX, 0;开始将十进制数转换为二进制数AGAIN: MOVBX, 10; ((010+a4) 10+…) 10+a0MUL  BX  AND  BYTE PTR [SI], 0FH            ADD  AL, [SI]            ADC  AH, 0            INC  SI LOOP AGAIN   POP     SI POP     CX POP     BX POP     DXRETGET_NUM ENDP;brief     : quick sort ,data type is double BYTE;note      : null;parameter : SI is start index of data array  and DI is end index of data array;date      : 2013/12/03;author    : @brtCALL_QUICK_SORT PROC NEAR;protect register that will usePUSH SIPUSH DIPUSH BPPUSH BXPUSH AXPUSH CXPUSH DX MOV  SI, AXMOV  DI, CXSUB  DI, 02HCALL QUICKSORT;recovery used register POP  DXPOP  CXPOP  AXPOP  BXPOP  BPPOP  DIPOP  SIRETCALL_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 ENDP;brief     : quick sort ,data type is BYTE;note      : null;parameter : SI is start index of data array  and DI is end index of data array;date      : 2013/12/03;author    : @brtQUICK PROC NEAR;protect register that will usePUSH SIPUSH DIPUSH BPPUSH BXPUSH AXPUSH CXPUSH DXCALL QUICKSORT;recovery used register POP  DXPOP  CXPOP  AXPOP  BXPOP  BPPOP  DIPOP  SIRETQUICK 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 NUM   ; 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 NUM   ; 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  DL, BYTE 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  DL,BYTE PTR [DI]LAHF               ;LOAD FLAGS TO AHAND  AH,41HCMP  AH,0H  JZ   IGNORE_LOOP_IN1SUB  DI,TYPE NUMJMP  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  AL,BYTE PTR [DI]MOV  BYTE PTR [SI],AL      LOOP_IN2:      CMP  SI,DILAHF                 ;LOAD FLAGS TO AHAND  AH,01HCMP  AH,01HJNE  IGNORE_LOOP_IN2     CMP  BYTE PTR [SI],DLLAHF                 ;LOAD FLAGS TO AHAND  AH,41H CMP  AH,0H JZ   IGNORE_LOOP_IN2ADD  SI,TYPE NUMJMP  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  AL,BYTE PTR [SI]         MOV  BYTE PTR [DI],AL  IGNORE_SWAP:JMP  LOOP_OUT END_QUICKPASS: MOV  BYTE PTR [SI],DL           ;FIRST VALUE STORED INTO DIVID ADRRESS    PUSH SI    PUSH BX    RETQUICKPASS ENDP;macro template;brief : load specified interrupt address;note  : in this version MACRO , interrupt num must pass by register;date  : 2013/12/03;author: @brtINTERRUPT_ADDR MACRO InterruptNum,InterruptProcName    PUSH DS    PUSH AX    PUSH BX    PUSH CX    MOV  AX, 00H    MOV  DS, AXMOV  AX, 04H     MUL  InterruptNum    MOV  BX, AX       MOV  WORD PTR DS:[BX]    , OFFSET InterruptProcName     MOV  WORD PTR DS:[BX+02H], SEG    InterruptProcName    POP  CX    POP  BX    POP  AX    POP  DS ENDM;brief : Translate compresse BCD stored in AL to value stored in AX;note  : null;date  : 2013/12/03;author: @brtcBCDtoValue PROC NEARPUSH CXMOV  CH, AL    AND  CH, 0FH    MOV  CL, 04H      SHR  AL, CL    MOV  CL, 0AH    MUL  CL     ADD  AX, CH    POP  CX    RETcBCDtoValue ENDP


0 0