⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 huibian.asm

📁 汇编常用的小程序
💻 ASM
字号:
DSPMESS PROC
	PUSH AX
	MOV AH,9
	INT 21H
	POP AX
	RET
DSPMESS ENDP

CRLF PROC
     PUSH AX
     PUSH DX
     MOV DL,0DH
     MOV AH,2
     INT 21H
     MOV DL,0AH
     MOV AH,2
     INT 21H
     POP DX
     POP AX
     RET
CRLF ENDP
;-------------------------------------------------------------------------------

;检查无符号数输入是否合格 in:si out:BP
CHECK PROC
       PUSH CX
       PUSH AX
       PUSH SI
       MOV BP,1              ;预先置BP为1
       INC SI
       MOV CL,[SI]
       XOR CH,CH
CHECK1:INC SI
       MOV AL,[SI]
       CMP AL,'0'            ;判断输入是否是0--9的数字
       JB CHECK2
       CMP AL,'9'
       JA CHECK2
       LOOP CHECK1
       JMP CHECK3
CHECK2:MOV BP,0              ;若有其他字符,则置BP为0
CHECK3:POP SI
       POP AX
       POP CX
       RET
CHECK ENDP
;-------------------------------------------------------------------------------
;子程序名CHECK
;功能:检查输入是否合格
;入口参数:si存放输入区首地址
;出口参数:BP存放1或0分别表示正确和错误
CHECK PROC
       PUSH CX
       PUSH AX
       PUSH SI
       MOV BP,1              ;预先置BP为1
       INC SI
       MOV CL,[SI]
       XOR CH,CH
       DEC CX
       INC SI
       MOV AL,[SI]
       CMP AL,'-'            ;判断第一个字符是否为'-'
       JE CHECK1
       CMP AL,'+'            ;判断第一个字符是否为'+'
       JE CHECK1
       DEC SI
       INC CX
CHECK1:INC SI
       MOV AL,[SI]
       CMP AL,'0'            ;判断输入是否是0--9的数字
       JB CHECK2
       CMP AL,'9'
       JA CHECK2
       LOOP CHECK1
       JMP CHECK3
CHECK2:MOV BP,0              ;若有其他字符,则置BP为0
CHECK3: POP SI
        POP AX
        POP CX
        RET
CHECK ENDP
;-------------------------------------------------------------------------------

;功能:把BX中无符号的二进制数转换为无符号十进制数ASCII码,并输出到屏幕上
;入口:BX
;OUT:屏幕
BINTOD PROC
        PUSH AX
        PUSH CX
        PUSH SI
        PUSH DX
        XOR  AX,AX
        XOR  DX,DX
        MOV  AX,BX
BINTOD1:MOV  SI,10
        MOV  CX,0
BINTOD2:DIV  SI
        ADD  DL,'0'
        PUSH DX
        MOV  DX,0
        INC  CX
        CMP  AX,0
        JNZ  BINTOD2
BINTOD3:POP  DX
        MOV AH,2
        INT 21H
        LOOP BINTOD3
        POP  DX
        POP  SI
        POP  CX
        POP  AX
        RET
BINTOD ENDP
;-------------------------------------------------------------------------------

;功能:把缓冲区中无符号的十进制数转换为无符号二进制数,存到BX中
;IN:SI
;OUT:BX
DTOBIN PROC
        PUSH AX
        PUSH CX
        PUSH DX
        PUSH SI
        XOR AX,AX
        INC SI
        MOV CL,[SI]
        INC SI
        XOR CH,CH
        JCXZ DTOBIN2
DTOBIN1:MOV DX,10
        MUL DX
        MOV DL,[SI]
        INC SI
        AND DL,0FH
        XOR DH,DH
        ADD AX,DX
        LOOP DTOBIN1
DTOBIN2:MOV BX,AX
        POP SI
        POP DX
        POP CX
        POP AX
        RET
DTOBIN ENDP
;-------------------------------------------------------------------------------
;子程序名DTOBIN
;功能:把缓冲区中有符号的十进制数转换为有符号二进制数,存到BX中
;入口参数:DS:SI存放缓冲区首地址
;出口参数:BX存放转换后的二进制数
DTOBIN PROC
      PUSH AX
      PUSH DX
      PUSH CX
      PUSH DI
      XOR AX,AX
      XOR DX,DX
      MOV DI,1                       ;预置DI为1,表示非负
      MOV CL,BYTE PTR[SI+1]
      MOV CH,0
      CMP BYTE PTR[SI+2],'-'         ;判断第一个字符是否为'-'
      JNZ SIGN
      MOV DI,-1                      ;置DI为-1,表示负数
      INC SI
      DEC CX
SIGN: CMP BYTE PTR[SI+2],'+'         ;判断字符是否为'+'
      JNZ NEXT1
      INC SI                         ;若是,SI加1
      DEC CX
NEXT1:ADD SI,2
      MOV BH,0
      PUSH DI
      MOV DI,10
BIN:  MOV BL,BYTE PTR[SI]
      SUB BL,'0'
      MUL DI                         ;乘十
      ADD AX,BX
      INC SI
      LOOP BIN
      POP DI
      CMP DI,-1                      ;判断是否非负
      JNZ NEXT2                      ;若是,跳到NEXT2
      NOT AX                         ;若是负数,求反
      INC AX                         ;加1
NEXT2:MOV BX,AX
      POP DI
      POP CX
      POP DX
      POP AX
      RET
DTOBIN ENDP
;-------------------------------------------------------------------------------

;子程序名:BINTOD
;功能:把BX中有符号的二进制数转换为有符号十进制数ASCII码,并输出到屏幕上
;入口参数:BX保存有符号的二进制数
;出口参数:屏幕
BINTOD PROC
      PUSH AX
      PUSH CX
      PUSH SI
      PUSH DX
      XOR  AX,AX           ;清零
      XOR  DX,DX
      MOV  AX,BX
      MOV  BX,1            ;预置BX为1,表示非负
      CMP  AX,0            ;AX跟零作比较
      JGE  UNSIGN          ;非负则跳转
      NEG  AX              ;负数求反
      MOV  BX,-1           ;置BX为-1
UNSIGN:MOV  SI,10
      MOV  CX,0
NEXT: DIV  SI              ;除十的余数
      ADD  DL,'0'          ;转为ASCII码
      PUSH DX              ;把数字逐位压栈
      MOV  DX,0
      INC  CX
      CMP  AX,0
      JNZ  NEXT
      CMP  BX,-1           ;判断是否为负数
      JNZ  PLAY
      MOV  DL,'-'          ;输出负号
      MOV  DH,0
      CALL OUTPUT
PLAY: POP  DX              ;数字出栈
      CALL OUTPUT          ;输出到屏幕上
      LOOP PLAY
      POP  DX
      POP  SI
      POP  CX
      POP  AX
      RET
BINTOD ENDP

OUTPUT PROC
        PUSH AX
        MOV AH,2
        INT 21H
        POP AX
        RET
OUTPUT ENDP
;-------------------------------------------------------------------------------

;功能:实现32位除法
;IN:被除数:DX:AX,除数:BX
;OUT:商:DX:AX,余数:BX
DIV32 PROC
      PUSH CX
      PUSH SI
      MOV SI,BX
      MOV CX,AX
      MOV AX,DX
      XOR DX,DX
      DIV SI
      XCHG CX,AX
      DIV SI
      MOV BX,DX
      MOV DX,CX
      POP SI
      POP CX
      RET
DIV32 ENDP
;-------------------------------------------------------------------------------

;功能:计算某个数的位数
;入口:AX
;出口:CX
WEISHU PROC
        PUSH AX
        MOV SI,10
        XOR CX,CX
WEISHU1:XOR DX,DX           ;除以10,直到商为0
        DIV SI
        INC CX              ;每除一次,CX加一
        CMP AX,0
        JE WEISHU2
        JMP WEISHU1
WEISHU2:POP AX
        RET
WEISHU ENDP
;-------------------------------------------------------------------------------

;'Continue?(Y.continue/Anykey.no):$'
CONTINUE PROC
          CALL CRLF
          MOV BP,1
          MOV DX,OFFSET MSG5
          CALL DSPMESS
          MOV DX,OFFSET INBUF            ;输出继续提示
          MOV AH,1
          INT 21H
          CALL CRLF
          CMP AL,'Y'
          JE CONTINUE1                           ;继续计算时跳转
          CMP AL,'y'
          JE CONTINUE1
          MOV BP,0
CONTINUE1:RET
CONTINUE ENDP
;-------------------------------------------------------------------------------

;DAYS1 DB 31,28,31,30,31,30,31,31,30,31,30,31
;DAYS2 DB 31,29,31,30,31,30,31,31,30,31,30,31
; INPUT: AX, BX
; OUTPUT: DX
CALDAYS PROC
         PUSH AX
	   PUSH CX
	   PUSH SI
	   MOV SI,OFFSET DAYS1
         XOR DX,DX
	   MOV CX,4
	   DIV CX
	   CMP DX,0
	   JNZ CALDAYS2
         PUSH AX
	   MOV CX,25
	   DIV CX
	   CMP DX,0
         POP AX
	   JNZ CALDAYS1
         MOV CX,100
         DIV CX
         CMP DX,0
         JNZ CALDAYS2
CALDAYS1:MOV SI, OFFSET DAYS2
CALDAYS2:MOV DL, [BX+SI-1]
	   XOR DH, DH
         POP SI
	   POP CX
         POP AX
	   RET
CALDAYS ENDP
;-------------------------------------------------------------------------------

;IN:AX
;OUT:LEAP
JUDGELEAP PROC
           PUSH AX
           PUSH CX
           PUSH DX
           MOV LEAP,1
           XOR DX, DX
	     MOV CX, 4
	     DIV CX
	     CMP DX, 0
	     JNZ JUDGELEAP1
           PUSH AX
	     MOV CX, 25
	     DIV CX
           POP AX
	     CMP DX, 0
           JNE JUDGELEAP2
           MOV CX,100
           DIV CX
           CMP DX,0
           JE JUDGELEAP2
JUDGELEAP1:MOV LEAP,0
JUDGELEAP2:POP DX
           POP CX
           POP AX
           RET
JUDGELEAP ENDP
;-------------------------------------------------------------------------------

;IN:AX
;OUT:DX
CALYEDAYS PROC
       CALL JUDGELEAP
       MOV DX,365
       CMP LEAP,0
       JE CALYEDAYS1
       INC DX
CALYEDAYS1:RET
CALYEDAYS ENDP
;-------------------------------------------------------------------------------

; INPUT: AX, BX
; OUTPUT: DX
CALDAYS PROC
	   PUSH CX
	   PUSH SI
	   MOV SI, OFFSET DAYS1
         CALL JUDGELEAP
         CMP LEAP,0
         JE CALDAYS2
CALDAYS1:MOV SI, OFFSET DAYS2
CALDAYS2:MOV DL, [BX+SI-1]
	   XOR DH, DH
	   POP SI
	   POP CX
	   RET
CALDAYS ENDP
;-------------------------------------------------------------------------------
;这是沉底法,即每次把最大的数往后放
;IN:SI(字数组) CX
;OUT:SI(字数组)
MAOPAO PROC
        PUSH AX
        PUSH BX
        PUSH CX
        PUSH BP
        DEC CX
MAOPAO1:PUSH CX
        XOR BP,BP
MAOPAO2:MOV AX,[SI+BP]
        MOV BX,[SI+BP+2]
        CMP AX,BX
        ;JNS MAOPAO3
        JG MAOPAO3
        ADD BP,2
        LOOP MAOPAO2
        JMP MAOPAO4
MAOPAO3:MOV [SI+BP],BX
        MOV [SI+BP+2],AX
        ADD BP,2
        LOOP MAOPAO2
MAOPAO4:POP CX
        LOOP MAOPAO1
        POP BP
        POP CX
        POP BX
        POP AX
        RET
MAOPAO ENDP
;-------------------------------------------------------------------------------
;IN:SI,CX
;OUT:SI
MAOPAO PROC
        PUSH AX
        PUSH BX
        PUSH CX
        PUSH BP
        DEC  CX
MAOPAO1:PUSH CX
        XOR BP,BP
MAOPAO2:MOV AX,[SI+BP]
MAOPAO3:MOV BX,[SI+BP+2]
        CMP AX,BX
        JG  MAOPAO4
        ADD BP,2
        LOOP MAOPAO3
MAOPAO4:MOV [SI+BP],BX
        MOV [SI+BP+2],AX
        ADD BP,2
        LOOP MAOPAO3
MAOPAO5:POP CX
        ADD SI,2
        LOOP MAOPAO1
        POP BP
        POP CX
        POP BX
        POP AX
        RET
MAOPAO ENDP
;-------------------------------------------------------------------------------

;子程序DTOBIN
;功能:将输入区的十进制ASCII码转换成二进制数
;入口参数:SI 指向输入区首地址
;出口参数:DX:AX 存放转换成二进制数
DTOBIN PROC
        PUSH BX
        PUSH CX
        PUSH SI
        PUSH DI
        XOR AX,AX
        XOR DX,DX
        INC SI
        MOV CL,[SI]       ;用字符串中字符个数作为循环数
        XOR CH,CH
        JCXZ DTOBIN2
DTOBIN1:CLC
        PUSH DX
        PUSH AX
        SHL AX,1
        RCL DX,1
        JC DTOBIN2        ;当输入区的数超出32位二进制数表示的范围时跳出
        SHL AX,1          ;用位移和加法代替乘10:先移位两次 相当于乘4
        RCL DX,1          ;再加一次原数,相当与乘5
        JC DTOBIN2        ;最后再位移一次,相当于乘0
        POP DI
        ADD AX,DI
        POP DI
        ADC DX,DI
        JC DTOBIN2
        SHL AX,1
        RCL DX,1
        JC DTOBIN2
        INC SI
        MOV BL,[SI]       ;10倍原数后加上下一位
        AND BL,0FH
        XOR BH,BH
        ADD AX,BX
        ADC DX,0
        LOOP DTOBIN1
        JMP DTOBIN2
DTOBIN2:POP DI
        POP SI
        POP CX
        POP BX
        RET
DTOBIN ENDP
;-------------------------------------------------------------------------------

;子程序名BINTOD
;功能:将二进制数转换成十进制ASCII码串,存入输出区
;入口参数:DX:AX存放需要转换的二进制数 SI存放输出区的首地址
;出口参数:SI指向输出区
BINTOD PROC
        PUSH SI
        PUSH BX
        XOR BP,BP
BINTOD1:MOV SI,WORD PTR 10
        MOV CX,AX           ;先进行高位除法
        MOV AX,DX
        XOR DX,DX
        DIV SI
        XCHG CX,AX
        DIV SI              ;再进行地位除法
        PUSH DX
        MOV BX,DX
        MOV DX,CX
        INC BP
        CMP AX,0
        JNE BINTOD1
BINTOD2:MOV CX,BP
BINTOD3:POP DX
        ADD DL,'0'           ;将十进制数转换成ASCII码
        MOV [DI],DL          ;将ASCII码保存到输出区
        INC DI
        LOOP BINTOD3
        POP BX
        POP SI
        RET
BINTOD ENDP
;-------------------------------------------------------------------------------



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -