📄 chagne.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 + -