stringtranslate.com

Códigos de operación BCD de Intel

Los códigos de operación BCD de Intel son un conjunto de seis instrucciones x86 que operan con números decimales codificados en binario . El sistema numérico utilizado para la representación de números en los procesadores x86 es 2. Esto se denomina sistema de numeración binario . Sin embargo, los procesadores x86 tienen un 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 en los registros de punto flotante , desde donde se pueden realizar cálculos de punto flotante 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 maneras en registros enteros: decimal empaquetado y decimal desempaquetado.

Generalmente se supone que los números BCD se almacenan en el byte más bajo de un registro, por ejemplo, AL; las operaciones en números BCD descomprimidos esperan el dígito menos significativo en el byte más bajo de un registro, por ejemplo, AL, y el dígito más significativo en el segundo byte más bajo, por ejemplo, AH.

Añadiendo

Sólo los números decimales del 0 al 99 se pueden sumar directamente.

Primero se suman los números como de costumbre usando add (o adc si necesitas el indicador de acarreo ). El procesador activará el indicador de ajuste si la suma de ambos nibbles inferiores es 16 o mayor, y el indicador de acarreo si la suma de ambos bytes es 256 o mayor.

Luego se ajusta el resultado dependiendo de la representación del número.

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 el indicador 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.

Multiplicación

Solo se admite la representación descomprimida. Solo se pueden multiplicar dos números de un solo dígito .

Primero se multiplican los dígitos 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 (sólo 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 sin empaquetar. Los operandos deben estar en el rango de 0 a 99.

Primero, los operandos se convierten a una representación binaria normal utilizando aad (ajuste ASCII antes de la división): el procesador convierte los números multiplicando el byte más significativo por 10 y sumando el byte menos significativo. El cociente y el resto de la división se obtienen de la forma habitual utilizando 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 de almacenamiento y extracción (FBSTP). La primera carga un entero BCD de 80 bits en la FPU, mientras que la segunda escribe un valor FPU como un valor entero de 80 bits en la memoria. Dentro de la FPU, los valores se almacenan como números flotantes de precisión extendida x87 normales . 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:

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 soporte BCD rudimentario al x86. [2]

Alternativas

Sumar números BCD usando estos códigos de operación es una tarea compleja y requiere muchas instrucciones para sumar incluso números modestos. También puede requerir una gran cantidad de memoria. [2] Si solo se realizan cálculos con números enteros, entonces todos los cálculos con números enteros son exactos, por lo que el radio 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]

Véase también

Referencias

  1. ^ ab "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) . Versión 072. Vol. 1. Intel Corporation . 2020-05-27 [1997]. págs. 3–2, 4-9–4-11 [4-10]. 253665-072US. Archivado (PDF) desde el original el 2020-08-06 . Consultado el 2020-08-06 . […] Al operar con enteros BCD en registros de propósito general , los valores BCD se pueden desempaquetar (un dígito BCD por byte) o empaquetar (dos dígitos BCD por byte). El valor de un entero BCD desempaquetado es el valor binario del medio byte 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 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; los bits 0 a 6 del byte 10 son bits de no importa ). Los enteros decimales negativos no se almacenan en forma de complemento a dos ; Se distinguen de los enteros decimales positivos solo 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 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]
  2. ^ abcdefghijkl Hyde, Randall (septiembre de 2003). Aritmética decimal. No Starch Press . Archivado desde el original el 2008-11-02 . Consultado el 2008-10-18 . {{cite book}}: |work=ignorado ( ayuda )
  3. ^ abcdef Volumen 2A: Referencia del conjunto de instrucciones, AM (PDF) . Vol. 2A. Intel Corporation . 17 de mayo de 2007. Archivado desde el original (PDF) el 15 de marzo de 2008 . Consultado el 27 de junio de 2007 . {{cite book}}: |work=ignorado ( ayuda )