The Intel BCD opcodes are a set of x86 instructions that operates with BCD numbers.
Contents
The radix used for the representation of numbers in the x86 processors is 2. This is called a binary numeral system. However the x86 processors do have limited support for the decimal numeral system.
Number representation
BCD numbers can be represented in two ways: packed decimal and unpacked decimal.
Adding
Only the decimal numbers 0 to 99 can be added directly.
First the numbers are added as usual using add (or adc if you need the carry flag).
Then the result is adjusted, depending on the number representation.
Subtraction
Only the decimal numbers 0 to 99 can be subtracted directly.
First the numbers are subtracted as usual using sub (or sbb if you need the carry flag).
Multiplication
Only unpacked representation is supported. Only two single digit numbers can be multiplied.
First the digits are multiplied as usual using mul.
Then the result is adjusted using aam (ASCII adjust for multiplication).
The processor divides the result by ten, storing the quotient (just the integral part) in the most significant byte of the result and the remainder in the least significant byte of the result.
Division
Only unpacked representation is supported. Operands must fall in the range 0 to 99.
First the operands are converted to normal binary representation using aad (ASCII adjust before division).
The processor converts numbers by multiplying the most significant byte by 10 and adding the least significant byte.
Then the quotient and remainder of the division are obtained as usual using div.
The quotient and remainder will be in normal binary representation.
History
Binary-coded decimal (BCD) numbers were in the past used for storing decimal numbers, especially in financial software.
The opcodes mentioned above give the x86 rudimentary BCD support.
Alternatives
Adding BCD numbers using these opcodes is a complex task, and requires many instructions to add even modest numbers. It can also require a large amount of memory.
All integer calculations are exact, so the radix of the number representation is not important for accuracy. Therefore, even financial software today usually stores values in binary representation and only converts to decimal for input and output.
On an x86 processor calculations with binary numbers are usually a lot faster than the same calculations with BCD numbers.