Los códigos de operación Intel BCD son un conjunto de seis instrucciones x86 que operan con números decimales codificados en binario . La base utilizada para la representación de números en los procesadores x86 es 2. Esto se denomina sistema numérico binario . Sin embargo, los procesadores x86 tienen soporte limitado para el sistema de numeración decimal .
Además, la parte x87 admite un formato BCD único de 18 dígitos (diez bytes) que se puede cargar y almacenar desde los registros de punto flotante , desde donde se pueden realizar cálculos FP ordinarios. [1]
Las instrucciones BCD enteras ya no se admiten en el modo largo .
Uso
Representación numérica
Los números BCD se pueden representar de dos formas en los registros de números enteros: decimal empaquetado y decimal descomprimido.
- Envasado (4 bits)
- En la representación decimal empaquetada, un dígito decimal se almacena en un nibble .
- Los valores de 10 a 15 no se utilizan. [2]
- Desembalado (8 bits)
Generalmente se supone que los valores se almacenan en los 8 bits inferiores de un registro, por ejemplo, AL.
Añadiendo
Solo se pueden sumar directamente los números decimales del 0 al 99 .
Primero, los números se agregan como de costumbre usando add (o adc si necesita la bandera de acarreo ). El procesador establecerá el indicador de ajuste si la suma de los dos nibbles inferiores es 16 o superior, y el indicador de acarreo si la suma de ambos bytes es 256 o superior.
Luego se ajusta el resultado, dependiendo de la representación numérica.
- Lleno
- El resultado se ajusta usando daa (ajuste decimal después de la adición): si el nibble menos significativo del resultado es 10 o más, o si se establece el indicador de ajuste, el procesador agrega 6 al resultado y descarta cualquier desbordamiento del nibble.
- Entonces, si el nibble más significativo del resultado es 10 o más, o si se establece la bandera de acarreo, el procesador agrega 96 (6 veces 16) al resultado y establece la bandera de acarreo. [2] [3]
- Desempaquetado
- El resultado se ajusta usando aaa (ajuste ASCII después de la adición): si el nibble menos significativo del resultado es 10 o más, entonces el procesador le agrega 6 y descarta cualquier desbordamiento del nibble, y lo almacena en el byte menos significativo.
- Se incrementa el byte más significativo.
- Tenga en cuenta que, en este punto, es posible que el byte más significativo no contenga un número decimal válido. [2] [3]
Sustracción
Solo los números decimales del 0 al 99 se pueden restar directamente. Primero, los números se restan como de costumbre usando sub (o sbb si necesita la bandera de acarreo). El procesador establecerá el indicador de ajuste si se produjo un préstamo en el nibble menos significativo, y el indicador de acarreo si se produjo un préstamo en el nibble más significativo.
- Lleno
- El resultado se ajusta usando das (ajuste decimal después de la resta): si el nibble menos significativo del resultado es 10 o más, o si el indicador de ajuste está establecido, entonces el procesador resta 6 del resultado.
- Entonces, si el nibble más significativo del resultado es 10 o más, o si se establece la bandera de acarreo, entonces el procesador resta 96 (6 veces 16) del resultado y establece la bandera de acarreo. [2] [3]
- Desempaquetado
- El resultado se ajusta usando aas (ajuste ASCII después de la resta): si el nibble menos significativo del resultado es 10 o más, entonces el procesador le resta 6 y lo almacena en el byte menos significativo.
- El byte más significativo se reduce.
- Tenga en cuenta que, en este punto, es posible que el byte más significativo no contenga un número decimal válido. [2] [3]
Multiplicación
Solo se admite la representación descomprimida. Solo se pueden multiplicar dos números de un solo dígito .
Primero, los dígitos se multiplican como de costumbre usando mul .
Luego, el resultado se ajusta usando aam (ajuste ASCII para multiplicación): el procesador divide el resultado por diez, almacenando el cociente (solo la parte integral ) en el byte más significativo del resultado y el resto en el byte menos significativo del resultado . [2] [3]
División
Solo se admite la representación descomprimida. Los operandos deben estar en el rango de 0 a 99.
Primero, los operandos se convierten a una representación binaria normal usando aad (ajuste ASCII antes de la división): el procesador convierte números multiplicando el byte más significativo por 10 y agregando el byte menos significativo. El cociente y el resto de la división se obtienen como de costumbre usando div , y estarán presentes en la representación binaria normal. [2] [3]
En x87
El coprocesador x87 tiene soporte BCD en forma de un par de instrucciones de carga (FBLD) y almacenamiento y pop (FBSTP). El primero carga un entero BCD de 80 bits en la FPU, mientras que el segundo escribe un valor FPU como un valor entero de 80 bits en la memoria. Dentro de la FPU, los valores se almacenan como flotadores normales de precisión extendida x87 . A diferencia de las versiones orientadas a números enteros, las dos instrucciones permanecen disponibles en modo largo. [1]
El formato de 80 bits se divide en lo siguiente:
79 | 78 .. 72 | 71 .. 0 |
---|---|---|
Firmar | Sin usar (0) | 18 dígitos empaquetados |
Hay un valor "indefinido" especial codificado como FFFFC000000000000000h.
Solicitud
Los números decimales codificados en binario (BCD) se utilizan para almacenar números decimales, especialmente en software financiero. [2]
Los códigos de operación mencionados anteriormente brindan el soporte BCD rudimentario x86. [2]
Alternativas
Agregar números BCD usando estos códigos de operación es una tarea compleja y requiere muchas instrucciones para agregar incluso números modestos. También puede requerir una gran cantidad de memoria. [2] Si solo realiza cálculos de números enteros, entonces todos los cálculos de números enteros son exactos, por lo que la base de la representación del número no es importante para la precisión. En un procesador x86, los cálculos con números binarios suelen ser mucho más rápidos que los mismos cálculos con números BCD. [2]
Ver también
- Conjuntos de instrucciones de manipulación de bits
Referencias
- ^ a b "4,7 BCD y enteros BCD empaquetados". Manual del desarrollador de software de arquitecturas Intel 64 e IA-32, Volumen 1: Arquitectura básica (PDF) . Version 072. 1 . Intel Corporation . 27 de mayo de 2020 [1997]. págs. 3–2, 4-9–4-11 [4-10]. 253665-072US. Archivado (PDF) desde el original el 6 de agosto de 2020 . Consultado el 6 de agosto de 2020 .
[…] Cuando se opera con números enteros BCD en registros de propósito general , los valores BCD pueden descomprimirse (un dígito BCD por byte) o empaquetarse (dos dígitos BCD por byte). El valor de un entero BCD descomprimido es el valor binario del mediobyte bajo (bits 0 a 3). El medio byte alto (bits 4 a 7) puede ser cualquier valor durante la suma y la resta, pero debe ser cero durante la multiplicación y la división. Los enteros BCD empaquetados permiten que dos dígitos BCD estén contenidos en un byte. Aquí, el dígito en el medio byte alto es más significativo que el dígito en el medio byte bajo. […] Cuando se opera con números enteros BCD en registros de datos FPU x87 , los valores BCD se empaquetan en un formato de 80 bits y se denominan enteros decimales. En este formato, los primeros 9 bytes contienen 18 dígitos BCD, 2 dígitos por byte. El dígito menos significativo está contenido en el medio byte inferior del byte 0 y el dígito más significativo está contenido en el medio byte superior del byte 9. El bit más significativo del byte 10 contiene el bit de signo (0 = positivo y 1 = negativo; bits 0 a 6 del byte 10 son no les importa bits). Los enteros decimales negativos no se almacenan en forma de complemento a dos ; se distinguen de los enteros decimales positivos sólo por el bit de signo. El rango de enteros decimales que se pueden codificar en este formato es −10 18 + 1 a 10 18 - 1. El formato de entero decimal existe solo en la memoria. Cuando se carga un entero decimal en un registro de datos FPU x87, se convierte automáticamente al formato de punto flotante de precisión extendida doble . Todos los enteros decimales se pueden representar exactamente en formato de precisión extendida doble. […]
[1] - ^ a b c d e f g h yo j k l Hyde, Randall (septiembre de 2003). Aritmética decimal . El arte de la programación en lenguaje ensamblador . Sin prensa de almidón . Archivado desde el original el 2 de noviembre de 2008 . Consultado el 18 de octubre de 2008 .
- ^ a b c d e f Volumen 2A: Referencia del conjunto de instrucciones, AM (PDF) . Manual del desarrollador de software de arquitecturas Intel 64 e IA-32 . 2A . Intel Corporation . 2007-05-17. Archivado desde el original (PDF) el 15 de marzo de 2008 . Consultado el 27 de junio de 2007 .