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

📄 chagne.asm

📁 进制转换和日期时间显示
💻 ASM
字号:
;************* **定义宏*************
PRI MACRO A
    LEA DX,A
    MOV AH,9
    INT 21H
ENDM


;**************定义堆栈段************
STACK SEGMENT PARA'STACK'
    DB 200 DUP(?)
STACK ENDS
;************定义数据段*********
DATA SEGMENT
   BUF0  DB 0AH,0DH,'***********************************$'
   BUF1  DB 0AH,0DH,'*          welcome to you!        *$'
   BUF2  DB 0AH,0DH,'*                                 *$'
   BUF3  DB 0AH,0DH,'*    This is a change progamme    *$'
   BUF4  DB 0AH,0DH,'*                                 *$'
   BUF5  DB 0AH,0DH,'*                    03(6),lumin  *$'
   BUF6  DB 0AH,0DH,'***********************************$'
   STR1  DB 0AH,0DH,'*1*: letter change  *2*: change(H-D)$'
   STR2  DB 0AH,0DH,'*3*: change(B-H)    *4*: change(H-B)$'
   STR3  DB 0AH,0DH,'              *0*: exit       $'
   STR4  DB 0AH,0DH,'Please choose(0-4):  $'
   O_ERO DB 0AH,0DH,'It is Error! $'
   INLET DB 0AH,0DH,'Input letters:$'
   INBIN DB 0AH,0DH,'Input a bin number:$'
   INDEC DB 0AH,0DH,'Input a dec number:$'
   INHEX DB 0AH,0DH,'Input a hex number:$'
   OUPUT DB 0AH,0DH,'Display The Result:$'
   IBUF  DB 20,0,20H DUP(?)
   IBUF2  DB 31,0,30 DUP(?)
   OBUF   DB 30 DUP (?)
   OBUF2  DB 5 DUP(?),'$'
DATA ENDS


;**************以下是代码段***********
CODE SEGMENT
   ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN  PROC FAR
      MOV AX,DATA
      MOV DS,AX

      PRI BUF0  ;显示进入窗口
      PRI BUF1
      PRI BUF2
      PRI BUF3
      PRI BUF4
      PRI BUF5
      PRI BUF6
INPUT:PRI  STR1  ;显示菜单选择项
      PRI  STR2
      PRI  STR3
      PRI  STR4
      
      MOV  AH,01H ;键盘输入数字
      INT  21H
      CMP  AL,'0' ;等于0则退出
      JZ   EXIT
      CMP  AL,'1' 
      JNZ  N1     ;不为1则转N1
      CALL L_TO_L ;等于1进行字母转换
      JMP  INPUT  ;返回菜单

N1:   CMP  AL,'2'  
      JNZ  N2
      CALL H_TO_D   ;等于2则进行16转换为10进制
      JMP  INPUT

N2:   CMP  AL,'3'
      JNZ  N3
      CALL B_TO_H  ;等于3则进行2转换为16进制
      JMP  INPUT

N3:   CMP  AL,'4'
      JNZ  INPUT
      CALL H_TO_B   ;等于4则进行16转换为2进制
      JMP  INPUT

EXIT: MOV AH,4CH
      INT 21H
MAIN ENDP    


;************大小写字母转换**********
L_TO_L  PROC     
      PRI  INLET      ;输出提示信息(下同)
      CALL GETCHAR     ;输入字母(下同)
      MOV SI,OFFSET IBUF+1   ;字符个数
      LEA DI,OBUF        ;存放转换后数据
      MOV CH,0
      MOV CL,[SI]   ;对字符进行计数
      INC SI
NEXT: MOV AL,BYTE PTR[SI]   ;取第一个字母
      CMP AL,'a'    ;比较是否为小写
      JB  M0
      CMP AL,'z'
      JA  E2
      SUB AL,20H    ;是小写,转换为大写
YES:  
      MOV [DI],AL   ;转换后字母存入存储区
      INC DI     ;存储区向后移一位
      INC SI     ;取下一个字符
      LOOP NEXT  ;循环(CX!=0)
      MOV  BYTE PTR[DI],'$'
      PRI OUPUT  ;显示输出提示           
      LEA DX,OBUF ;显示结果
      MOV AH,9
      INT 21H
 
M0:   CMP AL,'A'    ;比较是否为大写
      JB  E2
      CMP AL,'Z'
      JA  E2
      ADD AL,20H    ;是大写,转换为小写
      JMP YES
E2:   RET
L_TO_L  ENDP



;***********十六进制转换为十进制*********
H_TO_D PROC
     PRI  INHEX
     CALL GETCHAR ;键盘输入字符

     CMP IBUF+2,0DH;将输入的十六进制字符串
     JNZ LOP       ;转换为十六进制数
LOP: MOV AX,0
     MOV CL,IBUF+1 ;输入的字符个数
     MOV CH,0
     MOV SI,2
LOP2:MOV DL,IBUF[SI] ;指向第一个字符
     INC SI          ;指向下一个要转换的字符
     SUB DL,30H
     CMP DL,0AH
     JC LOP3
LOP3:PUSH CX   ;保存循环计数器
     MOV CL,4
     SHL AX,CL  ;左移4位
     OR  AL,DL
     POP CX
     LOOP LOP2   ;十六进制数转换直到完成
     
     MOV CX,5     ;循环次数为5
     MOV BX,10   
     MOV DI,OFFSET OBUF2+4  ;指向末尾
OK:  XOR DX,DX      ;被除数高16位清0
     DIV BX        
     OR  DL,30H      ;余数转换为ASCII码
     MOV [DI],DL    ;保存余数
     DEC DI         ;指针加1
     LOOP OK        ;循环5次
     PRI OUPUT      ;显示结果提示
     LEA DX,OBUF2    ;显示字符串
     MOV AH,9
     INT 21H
     MOV DL,'D'   ;结尾以D作为十进制标志
     MOV AH,2
     INT 21H
     RET	
H_TO_D ENDP


;***********二进制转换为十六进制*********
B_TO_H PROC
      PRI  INBIN
      CALL GETCHAR
      MOV BX,OFFSET IBUF  ;二进制数送BX
      PRI  OUPUT
      XOR  AX,AX
      MOV CH,4       ;循环4次
      MOV CL,4
BEG:  ROL BX,CL   ;将BX循环左移4位
      MOV AL,BL   ;低8位送AL
      AND AL,0FH  ;保存低4位
      ADD AL,30H  ;转换为ASCII码
      CMP AL,3AH  ;判断十六进制的ASCII码是否为A-F
      JBE YES2
      ADD AL,7H   ;是A-F则加7
YES2: MOV DL,AL   
      MOV AH,2    ;显示1位十六进制数
      INT 21H
      DEC CH      ;循环次数减1
      JNE BEG     ;没完则继续循环
      MOV DL,'H'  ;尾部加H作为十六进制标志
      MOV AH,2
      INT 21H
      RET
B_TO_H ENDP



;************十六进制转换为二进制**********
H_TO_B PROC
      PRI INHEX
      CALL GETCHAR
      PRI OUPUT
      MOV CL,IBUF+1   ;输入的十六进制位数
      XOR CH,CH       ;高位清0
      JCXZ EXIT2       ;CX=0则退出
      MOV SI,2         
H1:   MOV BL,IBUF[SI]  ;指向第一个字符
      CMP BL,'9'       ;判断是否在1-9之间
      JBE OK2
      SUB BL,7         ;大于则减7
OK2:  PUSH CX          ;保护内循环次数
      MOV CL,4
      SHL BL,CL        ;左移4位
      MOV CX,4
PRINT:MOV DL,'0'       ;
      SHL BL,1         ;左移一位
      JNC H2           ;有进位,则转
      INC DL           
H2:   MOV AH,2         ;显示"1"
      INT 21H          
      LOOP PRINT       ;循环显示第一个字符的二进制数
      MOV DL,20H       ;输出空格
      MOV AH,2
      INT 21H
      POP CX          ;恢复内循环次数
      INC SI          ;修改指针,指向下一字符
      LOOP  H1        ;外层循环
EXIT2: RET
H_TO_B ENDP

;*************显示错误子程序**********
ERO  PROC
      PRI O_ERO   ;显示错误信息
      RET
ERO  ENDP


;**************键盘输入子程序**********
GETCHAR PROC
      LEA DX,IBUF
      MOV AH,0AH
      INT 21H
      RET
GETCHAR ENDP


;****************程序结束*************

CODE ENDS
     END MAIN

⌨️ 快捷键说明

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