(汇编)键盘输入一个两位数的16进制,将其转换为10进制并显示

键盘输入一个两位数的16进制,将其转换为10进制并显示

主要思路:首先将16进制转为10进制数字存储在BX中,再将BX用字符存储在TEMP中,显示TEMP即可。
16进制转为10进制数字存储例子:
1.f ->15 将f字符变为数字15
2.255=15*16+15
10进制数字转换为字符存储:
用循环除10取余,将余数加30H变为字符
(原本想写一个四位数的16进制转为10进制的代码,但是在转为10进制数字存储时出现错误,也不知道怎么改,就写了这一个)
代码的运行结果,ff是输入的16进制,255是转换成10进制之后
代码的运行结果:ff是输入的16进制,255是转换成10进制(输入的16进制要小于ffh)

STACK   SEGMENT PARA STACK
S_AREA  DW      100H DUP(?)
STACK   ENDS
    
DATA    SEGMENT PARA
PROMPT  DB 'Please enter a hexadecimal number:',0DH,0AH,'$' 
PROMPT1 DB 'Input error!Please enter a hexadecimal number again:',0DH,0AH,'$'
TEMP   DB    3 DUP(?),'$' 	 
DATA    ENDS
  
CODE    SEGMENT PARA
        ASSUME  CS:CODE,DS:DATA,SS:STACK
     
MAIN    PROC    FAR
        MOV     AX,DATA
        MOV     DS,AX
        MOV     AX,STACK
        MOV     SS,AX
		CALL    HEXTODEC
   
EXIT:   MOV     AX,4C00H
        INT     21H
MAIN    ENDP

HEXTODEC PROC
        LEA DX,PROMPT
		MOV AH,09H
	    INT 21H
INTP:
        MOV BX,0   ;用于存放两位的16进制数 
        MOV CL,2 
INPUT:  
		MOV AH,1    ;从键盘取数 
		INT  21H 
		CMP AL,30H  ;<0? 
		JB  FAULT    
		CMP AL,39H  ;>9? 
		JA  AF       
		SUB AL,30H  ;字符1-9变为数字1-9
		JMP TONUM 
   AF:  
        AND AL,11011111B ;转换为大写字母  
		CMP AL,41H   ;<A? 
		JB  FAULT    		
		CMP AL,46H   ;>F吗? 
		JA  FAULT     
		SUB AL,37H   ;字符A-F变为数字10-15		
TONUM:  
        CMP CL,2
		JB  TWO
        MOV DH,16
		MUL DH
		JMP ADDITION
TWO:
		MOV DH,1
		MUL DH
ADDITION:
        ADD BX,AX 		
		DEC CL 
		JNZ INPUT
		JMP TODEC
FAULT:
        LEA DX,PROMPT1
		MOV AH,09H
	    INT 21H
	    JMP INTP
		
TODEC:
        MOV     CX,3
        MOV     AX,BX
        MOV     BX,10
        LEA     DI,TEMP+2
   
CHANGE:    MOV     DX,0
        DIV     BX                  ;AX/BX 相除之后:AX = 整数 ,DX = 余数  
        OR      DL,30H              ;将数字转换成字符
        MOV     BYTE PTR [DI],DL    ;BYTE PTR 表示[DI]处一个字节
        DEC     DI
        LOOP    CHANGE
		MOV     BYTE PTR [DI],3
        LEA     DX,TEMP
        MOV     AH,9
        INT     21H
		RET
HEXTODEC ENDP

CODE    ENDS
        END     MAIN

如有错误,欢迎指正!(有帮助的话,点个赞哟!)

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个包含据区域和代码区域的实现: ``` ; 8086 汇编语言程序,将键盘接受到的四十六进制转换为等值的二进制,并显示在屏幕上 DATA SEGMENT Input DB ? Output DB 4 DUP ('$') ; 存储二进制的字符串 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX ; 初始化据段寄存器 MOV AH, 0 ; 设置键盘输入的模式 INT 16h ; 等待键盘输入 MOV Input, AL ; 把输入存入 Input 中 MOV CX, 4 ; 循环计器,共循环 4 次 MOV SI, 0 ; 字符串索引,从 0 开始 Loop1: MOV DL, Input ; 将输入值存入 DL 中 AND DL, 0Fh ; 取 DL 的低四,即十六进制的一 CMP DL, 0Ah ; 如果 DL 大于等于 10,则为字母,需要加上 'A' - 10 JB NoLetter ; 如果不是字母,跳过 ADD DL, 'A' - 10 ; 加上 'A' - 10,得到字母对应的 ASCII 码值 NoLetter: ADD DL, '0' ; 加上 '0',得到字对应的 ASCII 码值 MOV Output[SI], DL ; 存储到 Output 组中 INC SI ; 字符串索引加 1 SHL Input, 4 ; 将输入值左移四,等同于乘以 16 LOOP Loop1 ; 继续循环,直到循环计器 CX 为 0 MOV AH, 09h ; 设置显示字符串的模式 LEA DX, Output ; DX 指向要显示的字符串 INT 21h ; 显示字符串 MOV AH, 4Ch ; 设置结束程序的模式 INT 21h ; 结束程序 CODE ENDS END START ``` 这个程序和之前的实现类似,但是在据区域中添加了两个组 Input 和 Output,分别用于存储输入的十六进制转换后的二进制。在代码区域中,我们使用了 LEA 指令来将 Output 组的地址存储到 DX 中,然后使用 INT 21h 中断调用来显示字符串。最后,我们使用 INT 21h 中断调用来结束程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值