如何用汇编语言编写:从键盘上输入一个十六进制数,将其转换成一个十进制数显示。

汇编入门,请不要太复杂,谢谢!
2024年11月19日 09:39
有2个网友回答
网友(1):

汇编是复杂的,可以下载MASM或者Radasm编译如下代码,在linux平台 可以直接用gcc自带的as汇编器进行编译。

DATA SEGMENT
  DATA1 DB ?
  DATA2 DB 2 DUP(?)
  
DATA20 DB 2 DUP(?)
  DATA3 DB 'Input Error, Please Enter Again!','$'
   DATA ENDS
  
STACK SEGMENT
  DB 5 DUP(?)
 STACK ENDS
  
CODE SEGMENT
  ASSUME CS:CODE, DS:DATA,SS:STACK
  
  START:MOV AX,DATA
  
    MOV DS,AX
 MOV AX,STACK
  
    MOV SS,AX
  
    MOV BX,0
  INPUT:MOV AH,01H
  
    INT 21H
CMP AL,51H;判断输入的字符是否为Q
  
    JE EXIT
 ;如果是Q就退出
  
    CMP AL,71H;判断输入的字符是否为q
  
    JE EXIT
;如果是Q就退出
PUSH AX
;把从键盘输入的字符的ASCII存到堆栈段
  
    SUB AL,30H ;判断是否为数字
  
    CMP AL,00H
JL INDI  ;如果不是就提示错误
 CMP AL,09H ;
  
    MOV BL,AL ;
  
    JLE OUTPUT2;如果是数字就输出
  
    POP AX  ;把AL的值取出来
PUSH AX ;
  
    MOV BL,AL
  
    SUB AL,41H;判断是否为大写字母A到F
  
    CMP AL,00H
  
    JL INDI
;如果不是就提示错误
CMP AL,06H
  
    JL CHANGE
  
    POP AX
PUSH AX
  
    MOV BL,AL
  
    SUB AL,61H;判断是否为小写字母a到f
  
    CMP AL,00H
  
    JL INDI ;如果不是就提示错误
  
   CMP AL,06H
  
   JL CHANGE
  
   POP AX
JMP INDI
CHANGE:MOV SI,0
MOV DI,0
MOV CL,4
MOV AL,BL
AND AL,11011111B;统一换为大写字母再转换,如果是大写字母就不变
SUB AL,31H
MOV BL,AL
AND AL,0FH ;与运算,取低位
MOV [DATA2+SI],AL ;把个位数存到DATA2中
MOV AL,BL
SAR AL,CL ;算术右移,取高位
MOV[DATA20+DI],AL;把十位数存到DATA20中
OUTPUT1: MOV DL,48H;输出十六进制符号H
MOV AH,02H
INT 21H
MOV DL,3DH ;输出等号‘=’
MOV AH,02H
INT 21H
MOV DL,[DATA20+DI];输出十位数
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,[DATA2+SI];输出个位数
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,20H
MOV AH,02H
INT 21H
JMP INPUT;跳到输入数字
  OUTPUT2:  MOV DL,48H ;输出数字
MOV AH,02H
INT 21H
MOV DL,3DH
MOV AH,02H
INT 21H
MOV DL,BL
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,20H
MOV AH,02H
INT 21H
JMP INPUT
INDI:MOV DL,20H ;提示子程序
MOV AH,02H
INT 21H
MOV DX,OFFSET DATA3 ;显示提示信息
MOV AH,09H
INT 21H
JMP INPUT
  
 EXIT:MOV AH,4CH
INT 21H
CODE ENDS
END START

网友(2):

输入一个多位十六进制数,显示等值的十进制。

输入字符,需要减去 37H 或 30H,变换为十六进制数字。再组成一个多位数。

显示之前,则需要相反的变化。

本程序具有对输入数据进行合法性判断的功能。

输入非十六进制数的符号时,本程序将不做反应。