子程序以及大小写、进制转换

这段代码实现了一个简单的字符输入程序,支持不同操作:小写字母转大写,大写字母转小写,二进制转十六进制,十六进制转二进制,以及十六进制转十进制。程序通过ASCII码比较和位运算进行转换,并能处理错误输入。
摘要由CSDN通过智能技术生成

子程序及进制转换

DATAS SEGMENT
STRING DB 'PLEASE INPUT A NUMBER: $'
STRING2 DB 'INPUT A LETTER: $'	
	TIP DB 'INPUT A NUMBER: ','$'
	TIP1 DB '  <=>  ','$'
	WARN DB 'ERROR! $'
	BIN DW 10 DUP(?)    ;存放二进制结果
    BUF DB 5 DUP(?)      ;存放十进制数 各个数位上的数值 如100,存放为 1,0,0
    MSG1 DB 'INPUT A HEX NUMBER',13,10,'$'
    MSG2 DB 'THE DEC NUMBER:',13,10,'$'
    CRLF DB 13,10,'$'    ;回车换行
DATAS ENDS

STACKS SEGMENT
    
STACKS ENDS

CODES SEGMENT		
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
	    MOV AX,DATAS
	    MOV DS,AX
	    
RE:	    MOV DL, 0AH 
		MOV AH, 02H
		INT 21H 	;换行

		MOV DX,OFFSET STRING
	 	MOV AH,09H
	 	INT 21H	 ;输出字符串
	    
	    MOV AH,01H
	    INT 21H ;AL存放输入字符的ASCII码
	    
	    CMP AL,31H
	    JZ X1
	    CMP AL,32H
	    JZ X2
	    CMP AL,33H
	    JZ X3
	    CMP AL,34H
	    JZ X4
	    CMP AL,35H
	    JZ X5
	    CMP AL,71H ;按q退出
	    JZ EN
	    CMP AL,'0'
	    JBE ERROR
	    CMP AL,'6'
	    JAE ERROR
	    
	    
	    JMP EN 
	X1:	CALL CHECK1
		JMP EN
	X2:	CALL CHECK2
		JMP EN
	X3: CALL CHECK3
		JMP EN
	X4: CALL CHECK4
		JMP EN
	X5: CALL CHECK5
		JMP EN
		
	;小写转大写   model1
		CHECK1 PROC
		MOV DL,0AH
		MOV AH,02H
		INT 21H ;换行
		MOV DX,OFFSET STRING2
	 	MOV AH,09H
	 	INT 21H	 ;输出字符串
	 	MOV AH,01H
	    INT 21H ;AL存放输入字符的ASCII码
	    
	    CMP AL,61H ; <a
	    JL ERROR
	    CMP AL,7AH ; >z
	    JG ERROR
	    
	    SUB AL,20H ;转换成大写字母
	    MOV BL,AL
	   	MOV DL,0AH
		MOV AH,02H
		INT 21H ;换行 	    
	    MOV DL,BL
	    MOV AH,02H
	    INT 21H ;输出
	   	MOV DL,0AH
		MOV AH,02H
		INT 21H ;换行 	    
		JMP RE
	    
	  
	    

	    
		CHECK1 ENDP 
	    JMP EN
	    
	;大写转小写    model2
	    CHECK2 PROC
		MOV DL,0AH
		MOV AH,02H
		INT 21H ;换行
		MOV DX,OFFSET STRING2
	 	MOV AH,09H
	 	INT 21H	 ;输出字符串
	 	MOV AH,01H
	    INT 21H ;AL存放输入字符的ASCII码
	    
	    CMP AL,41h ; <A
	    JL ERROR
	    CMP AL,5AH ; >Z
	    JG ERROR
	    
	    ADD AL,20H ;转换成小写字母
	    MOV BL,AL
	   	MOV DL,0AH
		MOV AH,02H
		INT 21H ;换行 	    
	    MOV DL,BL
	    MOV AH,02H
	    INT 21H ;输出
	   	MOV DL,0AH
		MOV AH,02H
		INT 21H ;换行 	    
		JMP RE
		CHECK2 ENDP 
	    JMP EN
	    
	;2->16  model3  
	    CHECK3 PROC
		MOV DL,0AH
		MOV AH,02H
		INT 21H ;换行
		
		LEA DX,TIP
		MOV AH,09H
		INT 21H  ; 字符串显示
		MOV CH,4 ;记录输入数字次数
		MOV DL,0
	
INPUT:
		MOV AH,1
		INT 21H  ;存放在AL里
		CMP AL,30H  
		JA L1       ;高于0跳L1 输入的是1
		ROL DL,1 
		OR DL,0     ;逻辑或 0000
		JMP AGAIN
L1:	
		ROL DL,1    ;循环左移一位
		OR DL,1   	;逻辑或 0001
AGAIN:
		DEC CH      ;循环输入4次	
		JZ PRINT  	;JZ结果为零
		JMP INPUT 
PRINT:
		CMP DL,0
		JB EN     	;低于
		CMP DL,9
		JA COMPER1  ;高于9就加37H,显示字母 刚好是对应的ACSII码
		ADD DL,30H  ;否则就加30H
		JMP SHOW
COMPER1:
		ADD DL,37H 
SHOW:
		MOV AL,DL
		
		LEA DX,TIP1
		MOV AH,09H
		INT 21H  ;显示字符串
		 
		MOV DL,AL 
		MOV AH,02H
		INT 21H  ;字符显示
		
		MOV DL,0AH
		MOV AH,02H
		INT 21H ;换行
		
		JMP RE
		CHECK3 ENDP 
		JMP EN
		
	;16->2	 model4
		CHECK4 PROC
		MOV DL,0AH
		MOV AH,02H
		INT 21H ;换行
		
		LEA DX,TIP
		MOV AH,09H
		INT 21H
		
		MOV DL,0AH
		MOV AH,02H
		INT 21H ;换行
		
	    MOV CH,4 ;记录输入数字次数
	    MOV CL,4 ;循环左移一次的位数
	    MOV BX,0 ;记录左移之后的数字
	    MOV DH,16 ;输出十六位二进制数字控制
	   
INPUT:
		MOV AH,1
		INT 21H 	;字符输入
		
		CMP AL,30H	;判断是否在0-9之间
		JB EN 		;0小则退出
		CMP AL,39H
		JA COMPER1 	;9大则判断与A的大小
		
		JMP CHANGE1	;若进行到下一步则说明这次输入的是0-9之间的数字,转换成二进制
COMPER1:
		CMP AL,41H 	;判断与A的大小
		JB EN 		;若小于A则退出
		CMP AL,46H 	;判断与F的大小
		JA COMPER2 	;若比F大则判断与a的大小
		JMP CHANGE2 ;进行到这一步则说明输入的是A-F,转换成二进制
COMPER2:
		CMP AL,61H 	;判断与a的大小
		JB EN 		;小于a则退出
		CMP AL,66H 	; 判断与f的大小
		JA EN 		; 大于f则退出
		JMP CHANGE3 ; 进行到这一步说明输入的是a-f,转换成二进制
	
CHANGE1:
		SUB AL,30H 	;转换成0-9
		SHL BX,CL 	;2进制左移四位 相当于移16进制的移位 和0000相或
		OR BL,AL 	;进行或运算得到四位二进制
		DEC CH 		;输入数字次数自减1
		JZ ENT 		;四位十六进制全部输入完毕则打印,否则继续输入
		JMP INPUT 
CHANGE2:
		SUB AL,37H 	;此时AL中是A-F,减去37H是0AH,0BH...0FH
		SHL BX,CL
		OR BL,AL
		DEC CH
		JZ ENT
		JMP INPUT
CHANGE3:
		SUB AL,57H 	;此时AL中是a-f,减去57H就是0AH,0BH...0FH
		SHL BX,CL
		OR BL,AL
		DEC CH
		JZ ENT
		JMP INPUT
					;所有的CHANGE1,23道理都是一样的
ENT:
		MOV DL, 0DH 
		MOV AH, 02H 
		INT 21H 	;回车
		MOV DL, 0AH 
		MOV AH, 02H
		INT 21H 	;换行
					
		JMP PRINT
PRINT:
		SHL BX,1  	;BX左移一位
		JNC L1 		;判断进位标志位,如果是0 跳到了L1
		MOV DL,'1' 	;输出1
		MOV AH,02H
		INT 21H
		DEC DH
		JZ RE

		JMP PRINT
L1:
		MOV DL,'0' 	;否则输出0 
		MOV AH,02H
		INT 21H
		DEC DH 
		JZ RE
		JMP PRINT
		CHECK4 ENDP 
		JMP EN
		
	;16->10	  model5
		CHECK5 PROC
		MOV DL,0AH
		MOV AH,02H
		INT 21H 		;换行
	    MOV BX,0        ;初始化BX
	       
	    LEA DX,MSG1  ;输出提示字符串
	    MOV AH,09H
	    INT 21H
	       
INPUT:
	    MOV AH,01H    ;输入一个字符
	    INT 21H		  ;存到AL里
	       
	    SUB AL,30H    ;把AL中的ASCII码转换成数值
	    JL INIT
	   
	    CMP AL,10     ;输入的数在0-9之间跳转
	    JL TOBIN	  ;小于
	       
	    SUB AL,27H    ;再转换为a-f
	    CMP AL,0AH	  ;输入的字符比a小
	    JL INIT       ;结束输入
	    CMP AL,10H    ;输入的字符比f大
	    JGE INIT      ;结束输入
	       
TOBIN:            	  ;转换为二进制,把输入组合成意义上的数值
	    MOV CL,4        
	    SHL BX,CL     ;BX左移4位
	    MOV AH,0        
	    ADD BX,AX     ;把输入后并从ASCII码转换来的值与BX相加
	    MOV BIN,BX    ;转换成二进制数后存到内存BIN
	    JMP INPUT     ;继续输入
	       
INIT:                	;初始化,准备转换
	    MOV AX,BIN        
	    MOV BX,10        
	    MOV SI,4        ;循环四次,
	      
TODEC:            		;转为各个数位上的数值,如100转换为1,0,0 百位为1...
	    MOV DX,0        
	    DIV BX          ;10法得到各个位上的数值 
	    MOV [BUF+SI],DL ;余数为该位上的值,第一次循环为个位,第二次为十位...;存到内存中
	    DEC SI            
	    CMP AX,0        ;商是否为0,为0算法结束
	    JA TODEC
	  
	
	    LEA DX,CRLF     ;显示提示
	    MOV AH,09H
	    INT 21H
	    LEA DX,MSG2
	    MOV AH,09H
	    INT 21H
	      
OUTPUT:                	;输出内存中存放的各个数位上的数值
	    INC SI
	    MOV DL,[BUF+SI]
	    ADD DL,30H            ;转为ASCII
	    MOV AH,2
	    INT 21H
	    CMP SI,4
	    JB OUTPUT
	    JMP RE
		CHECK5 ENDP
		JMP EN
		
ERROR:	MOV DL,0AH
		MOV AH,02H
		INT 21H ;换行
		LEA DX,WARN
		MOV AH,09H
		INT 21H
		MOV DL,0AH
		MOV AH,02H
		INT 21H ;换行	    
	    JMP RE ;错误后结束
	    
	EN: MOV AH,4CH
	    INT 21H
CODES ENDS
    END START











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值