从十六进制数到DEC数 [英] From HEX number to DEC number

查看:152
本文介绍了从十六进制数到DEC数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嘿伙计们,

我编写了一个程序,将十六进制数转换为十进制数。

一切正常但没有错误但答案不正确我不知道了解错误的位置,例如:

如果我输入了十六进制数:7B2F而右侧数字是:31535但是在我的编程中我得到了:38377

我很高兴寻求帮助。

我的编程:

Hey Guys,
I wrote a program that converts a hexadecimal number to decimal number.
Everything works correctly without errors but the answer is not correct and I do not understand where the mistake, for example:
if i enterd hex num : 7B2F and the right dec num is : 31535 but in my prog i got : 38377
Id be happy for some help.
My prog:

; HW1.asm
;
    .MODEL SMALL
    .STACK 100h
    .DATA
START_TEXT	DB 'This program converts numbers from Hex to Decimal'
            DB    'Enter number up to FFFF:' ,13,10,'$'
RESULT_TEXT	DB  ' H = XXXXX D ','$'
decNum	 DW  ?
Ten 	 DW  10

;Program start here:
	.CODE
	MOV AX,@DATA   ; DS can be written to only through a register
    MOV DS,AX      ; Set DS to point to data segment
    MOV AH,9       ; Set print option for int 21h
    MOV DX,OFFSET START_TEXT  ;  Set  DS:DX to point to START_TEXT
    INT 21h
;
;   Get HEX num - First digit
	MOV AH,1
	INT 21H
	MOV AH,0
	CMP AL,41h		
	JAE SUB_31		;jump if its in the range A-F
	SUB AL,30h
	JMP DecNumReady		;dec num is ready
SUB_31:
	SUB AL,31h
DecNumReady:
	MOV DX,0
	MOV BX,4096		;16^3
	MUL BX
	MOV decNum,AX
;   HEX num - Sec digit
	MOV AH,1
	INT 21H
	MOV AH,0
	CMP AL,41h	
	JAE SUB_SEC_31		;jump if its in the range A-F
	SUB AL,30h
	JMP DecNumReady_SEC		;dec num is ready
SUB_SEC_31:
	SUB AL,31h
DecNumReady_SEC:
	MOV DX,0
	MOV BX,256		;16^2
	MUL BX
	ADD decNum,AX
;   HEX num - Third digit
	MOV AH,1
	INT 21H
	MOV AH,0
	CMP AL,41h		
	JAE SUB_THIRD_31		;jump if its in the range A-F
	SUB AL,30h
	JMP DecNumReady_SEC		;dec num is ready
SUB_THIRD_31:
	SUB AL,31h
DecNumReady_THIRD:
	MOV DX,0
	MOV BX,16		;16
	MUL BX
	ADD decNum,AX
;   HEX num - Fourth digit
	MOV AH,1
	INT 21H
	MOV AH,0
	CMP AL,41h
	JAE SUB_FOURTH_31
	SUB AX,30h
	JMP DecNumReady_FOURTH
SUB_FOURTH_31:
	SUB AX,31h
DecNumReady_FOURTH:
	ADD decNum,AX
;
;	Print
	MOV DX,0
	MOV AX,decNum
	MOV BX,10
	DIV BX
	ADD DL,'0'
	MOV RESULT_TEXT[9],DL
;
	MOV DX,0
	MOV AX,decNum
	MOV BX,10
	DIV BX
	ADD DL,'0'
	MOV RESULT_TEXT[8],DL
;
	MOV DX,0
	;MOV decNum,AX
	MOV BX,10
	DIV BX
	ADD DL,'0'
	MOV RESULT_TEXT[7],DL
;
	MOV DX,0
	;MOV decNum,AX
	MOV BX,10
	DIV BX
	ADD DL,'0'
	MOV RESULT_TEXT[6],DL
;
	MOV DX,0
	;MOV decNum,AX
	MOV BX,10
	DIV BX
	ADD DL,'0'
	MOV RESULT_TEXT[5],DL
;
	MOV AH,9       ; Set print option for int 21h
    MOV DX,OFFSET RESULT_TEXT		;  Set  DS:DX to point to RESULT_TEXT
    INT 21h
;Program end's here:

     MOV AH,4Ch       ; Set terminate option for int 21h
     INT 21h       ; Return to DOS (terminate program)
     END 

推荐答案

'
RESULT_TEXT DB'H = XXXXX D', '
' RESULT_TEXT DB ' H = XXXXX D ','


'
decNum DW?
十个DW 10

;程序从这里开始:
.CODE
MOV AX,@ DATA; DS只能通过寄存器
MOV DS,AX写入;设置DS指向数据段
MOV AH,9;设置打印选项为int 21h
MOV DX,OFFSET START_TEXT;设置DS:DX指向START_TEXT
INT 21h
;
;得到十六进制数 - 第一个数字
MOV AH,1
INT 21H
MOV AH,0
CMP AL,41h
JAE SUB_31;如果它在AF范围内则跳跃
SUB AL,30h
JMP DecNumReady; dec num已准备好
SUB_31:
SUB AL,31h
DecNumReady:
MOV DX,0
MOV BX,4096; 16 ^ 3
MUL BX
MOV decNum,AX
; HEX数字 - 秒数字
MOV AH,1
INT 21H
MOV AH,0
CMP AL,41h
JAE SUB_SEC_31;如果它在AF $范围内则跳跃b $ b SUB AL,30h
JMP DecNumReady_SEC; dec num已准备好
SUB_SEC_31:
SUB AL,31h
DecNumReady_SEC:
MOV DX,0
MOV BX,256; 16 ^ 2
MUL BX
ADD decNum,AX
; HEX num - 三位数
MOV AH,1
INT 21H
MOV AH,0
CMP AL,41h
JAE SUB_THIRD_31;如果它在AF $范围内则跳转b $ b SUB AL,30h
JMP DecNumReady_SEC; dec num已准备好
SUB_THIRD_31:
SUB AL,31h
DecNumReady_THIRD:
MOV DX,0
MOV BX,16; 16
MUL BX
ADD decNum,AX
; HEX num - 第四位数
MOV AH,1
INT 21H
MOV AH,0
CMP AL,41h
JAE SUB_FOURTH_31
SUB AX,30h
JMP DecNumReady_FOURTH
SUB_FOURTH_31:
SUB AX,31h
DecNumReady_FOURTH:
ADD decNum,AX
;
;打印
MOV DX,0
MOV AX,decNum
MOV BX,10
DIV BX
ADD DL,'0'
MOV RESULT_TEXT [9] ,DL
;
MOV DX,0
MOV AX,decNum
MOV BX,10
DIV BX
ADD DL,'0'
MOV RESULT_TEXT [8], DL
;
MOV DX,0
; MOV decNum,AX
MOV BX,10
DIV BX
ADD DL,'0'
MOV RESULT_TEXT [7] ,DL
;
MOV DX,0
; MOV decNum,AX
MOV BX,10
DIV BX
ADD DL,'0'
MOV RESULT_TEXT [6] ,DL
;
MOV DX,0
; MOV decNum,AX
MOV BX,10
DIV BX
ADD DL,'0'
MOV RESULT_TEXT [5] ,DL
;
MOV AH,9;为int 21h设置打印选项
MOV DX,OFFSET RESULT_TEXT;设置DS:DX指向RESULT_TEXT
INT 21h
;程序结束位于:

MOV AH,4Ch;为int 21h设置终止选项
INT 21h;返回DOS(终止程序)
END
' decNum DW ? Ten DW 10 ;Program start here: .CODE MOV AX,@DATA ; DS can be written to only through a register MOV DS,AX ; Set DS to point to data segment MOV AH,9 ; Set print option for int 21h MOV DX,OFFSET START_TEXT ; Set DS:DX to point to START_TEXT INT 21h ; ; Get HEX num - First digit MOV AH,1 INT 21H MOV AH,0 CMP AL,41h JAE SUB_31 ;jump if its in the range A-F SUB AL,30h JMP DecNumReady ;dec num is ready SUB_31: SUB AL,31h DecNumReady: MOV DX,0 MOV BX,4096 ;16^3 MUL BX MOV decNum,AX ; HEX num - Sec digit MOV AH,1 INT 21H MOV AH,0 CMP AL,41h JAE SUB_SEC_31 ;jump if its in the range A-F SUB AL,30h JMP DecNumReady_SEC ;dec num is ready SUB_SEC_31: SUB AL,31h DecNumReady_SEC: MOV DX,0 MOV BX,256 ;16^2 MUL BX ADD decNum,AX ; HEX num - Third digit MOV AH,1 INT 21H MOV AH,0 CMP AL,41h JAE SUB_THIRD_31 ;jump if its in the range A-F SUB AL,30h JMP DecNumReady_SEC ;dec num is ready SUB_THIRD_31: SUB AL,31h DecNumReady_THIRD: MOV DX,0 MOV BX,16 ;16 MUL BX ADD decNum,AX ; HEX num - Fourth digit MOV AH,1 INT 21H MOV AH,0 CMP AL,41h JAE SUB_FOURTH_31 SUB AX,30h JMP DecNumReady_FOURTH SUB_FOURTH_31: SUB AX,31h DecNumReady_FOURTH: ADD decNum,AX ; ; Print MOV DX,0 MOV AX,decNum MOV BX,10 DIV BX ADD DL,'0' MOV RESULT_TEXT[9],DL ; MOV DX,0 MOV AX,decNum MOV BX,10 DIV BX ADD DL,'0' MOV RESULT_TEXT[8],DL ; MOV DX,0 ;MOV decNum,AX MOV BX,10 DIV BX ADD DL,'0' MOV RESULT_TEXT[7],DL ; MOV DX,0 ;MOV decNum,AX MOV BX,10 DIV BX ADD DL,'0' MOV RESULT_TEXT[6],DL ; MOV DX,0 ;MOV decNum,AX MOV BX,10 DIV BX ADD DL,'0' MOV RESULT_TEXT[5],DL ; MOV AH,9 ; Set print option for int 21h MOV DX,OFFSET RESULT_TEXT ; Set DS:DX to point to RESULT_TEXT INT 21h ;Program end's here: MOV AH,4Ch ; Set terminate option for int 21h INT 21h ; Return to DOS (terminate program) END


您正在使用

You are using
SUB AL,31h



这样'A'变为 16 (小数),你应该改为使用


This way 'A' becomes 16 (decimal), you should instead use

SUB AL,37h


这篇关于从十六进制数到DEC数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆