要将(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
上述过程的最终结果是不同的。第二种方法错了吗?为什么呢?
答案 0 :(得分:0)
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
答案 1 :(得分:0)
我使用此代码以C语言从十六进制到BCD进行1字节转换 并且仅适用于0-99d。 如果需要2字节,则单词,过程类似。
例如,它将转换78d(0x4E)=> 0x78
uint8 convert2BCD(uint8 hexData)
{
uint8 bcdHI=hexData/10;
uint8 bcdLO=hexData%10;
uint8 bcdData= (bcdHI<<4)+bcdLO;
return bcdData;
}
答案 2 :(得分:0)
这是一个将 uint32 转换为 BCD 并将其存储在数组中的 C 函数,因此分别以十进制格式。请注意,定义的 'len' 是十进制格式的数据类型的最大长度,因此 uint32 全值表示 4,294,967,295 组成 10 位。
#define len 10
void BCD(uint32_t value, uint8_t bcd[len])
{
uint32_t factor;
uint32_t decimal = len;
uint32_t remains = value;
for(uint8_t i = 0; i < decimal; ++i)
{
factor = 1;
for (uint8_t j = 0; j < (decimal - i - 1); ++j)
factor *= 10;
bcd[decimal - i - 1] = remains / factor;
remains = remains % factor;
}
return;
}
答案 3 :(得分:-1)
第二种方法不是错误的,但它实际上是转换主要方法的一部分,即大于9的数字应该总是通过BCD调整方法调整(加6)你得到的答案是有效的BCD !