Código de operación Intel BCD - Intel BCD opcode

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.

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.
  • Desembalado (8 bits)
    • En la representación decimal descomprimida, un dígito decimal se almacena en un byte .
    • Los valores de 10 a 255 no se utilizan.
    • El nibble superior se ignora y puede ser cero o el nibble inicial para el carácter ASCII (valor 3).

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.
  • 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.

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.
  • 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 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.

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 .

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.

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.

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.

Los códigos de operación mencionados anteriormente brindan el soporte BCD rudimentario x86.

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

Ver también

Referencias