Assembly 汇编程序:为什么存在BCD?

Assembly 汇编程序:为什么存在BCD?,assembly,x86,cpu-architecture,dataformat,bcd,Assembly,X86,Cpu Architecture,Dataformat,Bcd,我知道如果你不懂二进制,BCD更像是一种直观的数据类型。 但我不知道为什么要使用这种编码,因为它是浪费,所以好像没有什么意义 以4位表示(当表示大于9时) 另外,我认为x86只直接支持add和sub(您可以通过FPU转换它们) 这可能来自旧机器或其他体系结构?BCD算法对于精确的十进制计算非常有用,这通常是金融应用、会计等的一项要求。它还使10的乘除变得更容易。现在有更好的选择 有一种很好的方法可以讨论其利弊。BCD确实是浪费空间的,但它的优点是它是一种固定音高的格式,可以很容易地找到特定数字中

我知道如果你不懂二进制,BCD更像是一种直观的数据类型。 但我不知道为什么要使用这种编码,因为它是浪费,所以好像没有什么意义 以4位表示(当表示大于9时)

另外,我认为x86只直接支持add和sub(您可以通过FPU转换它们)


这可能来自旧机器或其他体系结构?

BCD算法对于精确的十进制计算非常有用,这通常是金融应用、会计等的一项要求。它还使10的乘除变得更容易。现在有更好的选择


有一种很好的方法可以讨论其利弊。

BCD确实是浪费空间的,但它的优点是它是一种固定音高的格式,可以很容易地找到特定数字中的第n个数字


另一个优点是允许对任意大小的数字进行精确的算术计算。此外,使用上面提到的“固定间距”特性,这样的算术运算可以很容易地分块到多个线程(并行处理)。

BCD存在于现代x86 CPU中,因为它位于原始8086处理器中,并且所有x86 CPU都与8086兼容。早在那时,x86中的BCD操作就被用来支持业务应用程序。处理器本身的BCD支持已不再真正使用


请注意,BCD是十进制数的精确表示,而浮点则不是,在硬件中实现BCD要比实现浮点简单得多。这类事情在处理器只有不到100万个晶体管以几兆赫的频率运行时更为重要。

BCD在电子频谱的低端非常有用,当寄存器中的值由某个输出设备显示时。例如,假设您有一个计算器,它有七个显示数字的段。如果每个显示器都由单独的位控制,则很方便


现代x86处理器用于具有此类显示器的设备似乎不太可能,但x86的历史可以追溯到很久以前,ISA保持了大量的向后兼容性。

我相信前面链接到的Wiki文章会更详细,但我在IBM大型机编程(PL/I)中使用了BCD。BCD不仅保证您可以查看字节的特定区域以找到单个数字(有时这很有用),还允许硬件应用简单规则来计算所需的精度和比例,例如将两个数字相加或相乘


我记得,有人告诉我,在大型机上,对BCD的支持是在硬件中实现的,当时,这是我们表示浮点数的唯一选项。(我们说的是18年过去了!)

30多年前我上大学的时候,有人告诉我为什么BCD(COBOL中的COMP-3)是一种很好的格式

所有这些原因都与现代硬件无关。我们有快速的二进制定点算法。我们不再需要通过向每个BCD数字添加偏移量来将BCD转换为可显示格式。我们很少将数字存储为每位数8位,因此BCD每位数只需要4位这一事实并不十分有趣


BCD是一种遗物,应该留在过去,留在它所属的地方。

我认为BCD在很多方面都很有用,原因如上所述。有一件很明显的事情似乎被忽略了,那就是提供一条从二进制到BCD的指令,反之亦然。这在将ASCII数转换为算术二进制时非常有用


其中一张海报错误地认为数字通常存储在ASCII码中,实际上大量的二进制数字存储是因为它更有效。把ASCII码转换成二进制有点复杂。BCD在某种程度上介于ASCII和二进制之间,如果有bsdtoint和inttobcd指令,它将使转换变得非常容易。对于算术运算,所有ASCII值必须转换为二进制。因此,BCD实际上在ASCII到二进制的转换中很有用。

如今,通常以二进制格式存储数字,并将其转换为十进制格式以供显示,但转换确实需要一些时间。如果数字的主要用途是显示,或添加到将要显示的数字中,则以十进制格式执行计算可能比以二进制格式执行计算并转换为十进制更为实际。许多具有数字读数的设备和许多视频游戏都以压缩BCD格式存储数字,每字节存储两位数。这就是为什么许多分数计数器在1000000点溢出,而不是一些二值幂。如果硬件不支持压缩BCD算法,那么替代方案将不是使用二进制,而是使用非压缩十进制。在显示时将压缩BCD转换为非压缩十进制可以很容易地一次转换一个数字。相比之下,将二进制转换为十进制要慢得多,并且需要对整个数量进行操作

顺便说一下,8086指令集是我见过的唯一一个包含“ASCII调整除法”和“ASCII调整乘法”指令的指令集,其中一个指令集将一个字节乘以10,另一个指令集将一个字节除以10。奇怪的是,值“0A”是机器指令的一部分,替换不同的数字将导致这些指令与其他量相乘或相除,但这些指令没有被记录为通用的乘/除常量指令。我想知道为什么这个特性没有被记录下来,因为它本来是有用的

还值得注意的是,处理器用于添加或减去压缩BCD的各种方法。许多人执行二进制加法,但使用标志来跟踪进位是否来自b