要将(213AFE)H
转换为BCD,首先必须将其转换为二进制,从而得到(2177790)D
。现在每个数字都转换为它的BCD代码,它给出了(0010 0001 0111 0111 0111 1001 0000)BCD
。
另一种方法是将十六进制值转换为二进制,它给出(0010 0001 0011 1010 1111 1110)B
,然后通过向每个大于9的数字加6来进行BCD调整,如下所示:
0010 0001 0011 1010 1111 1110
+ 0110 0110 0110
-----------------------------
0010 0001 0100 0001 0110 0100 -> 35092368D
上述过程的最终结果是不同的。第二种方法错了吗?为什么?
Ascii_Hex: ;procedure to convert Ascii to Hex
mov rax,0
mov rcx,4
mov rsi,hex
mov rbx,0
loop1:
rol bx,4
mov al,[rsi]
cmp al,'9'
jbe sub30h
sub al,7h
sub30h:
sub al,30h
add bx,ax
inc rsi
loop loop1
ret
HtB: ;procedure to convert HEX to BCD
io 1,1,msg,msglen
io 0,0,hex,5
call Ascii_Hex ;call to procedure to convert ascii to hex
mov rcx,5
mov ax,bx
mov bx,0Ah
loop2:
mov rdx,0
Div bx
push dx
loop loop2
mov rsi,hex
mov rcx,5
loop3:
pop dx
add dl,30h
mov[rsi],dl
inc rsi
loop loop3
io 1,1,hex,5
io 1,1,newline,1
ret
第二种方法不是错误的,但它实际上是主要转换方法的一部分,即大于9的数字应该总是通过BCD调整方法调整(加6)你得到的答案是有效的BCD!