2010-03-01 72 views
11

Sé que BCD es como un tipo de datos más intuitivo si no conoce el binario. Pero no sé por qué usar esta codificación, es como que no tiene mucho sentido ya que es una representación de desecho en 4bits (cuando la representación es mayor que 9).Ensamblador: ¿por qué BCD existe?

También creo que x86 solo admite adiciones y subs directamente (puede convertirlos a través de FPU).

¿Es posible que esto provenga de máquinas antiguas u otras arquitecturas?

Gracias!

Respuesta

4

Creo que BCD es útil para muchas cosas, las razones expuestas anteriormente. Una cosa obvia que parece haberse pasado por alto es proporcionar una instrucción para pasar de binario a BCD y viceversa. Esto podría ser muy útil para convertir un número ASCII en binario para aritmático.

Uno de los carteles estaba equivocado acerca de los números almacenados a menudo en ASCII, en realidad se realiza una gran cantidad de almacenamiento de números binarios porque es más eficiente. Y convertir ASCII en binario es un poco complicado. BCD está entre ASCII y binario, si hubiera instrucciones bsdtoint e inttobcd, las conversiones serían realmente fáciles. Todos los valores ASCII se deben convertir a binarios para aritmáticos. Entonces, BCD es realmente útil en esa conversión de ASCII a binario.

11

La aritmética BCD es útil para cálculos decimales exactos, que a menudo es un requisito para aplicaciones financieras, contabilidad, etc. También facilita la multiplicación/división por potencias de 10. En estos días hay mejores alternativas.

Hay una buena Wikipedia article que analiza los pro y los contras.

+1

"mejores alternativas"? Construiría un tipo 'BigDecimal' de C++ en el BCD del hardware; seguramente sería rápido si lo hicieras de esa manera. No estoy seguro de qué sería "mejor" que usar el tipo de datos de hardware. –

+2

Dudo que las CPU x86 modernas tengan implementaciones optimizadas de BCD; probablemente se hayan implementado como microcódigo con un enfoque en la compatibilidad, no en el rendimiento. – Michael

+0

IBM tiene soporte de hardware para DECFLOAT en sus CPU POWER 6. –

5

BCD es un desperdicio de espacio, es cierto, pero tiene la ventaja de ser un formato de "tono fijo" , por lo que es fácil encontrar el enésimo dígito en un número en particular.

Otra ventaja es que permite cálculos aritméticos exactos en números de tamaño arbitrarios. Además, utilizando las características de "tono fijo" mencionadas, tales operaciones aritméticas se pueden fragmentar fácilmente en múltiples hilos (procesamiento en paralelo).

+0

Los cálculos aritméticos exactos en números de tamaño arbitrarios también se pueden hacer fácilmente en números binarios normales con números binarios normales. – Nubok

+1

@nubok: con BCD, se puede leer en un valor con formato decimal de tamaño arbitrario, realizar cálculos en él y escribirlo en formato decimal, todo en un tiempo constante por dígito. Si el formato de número de tamaño arbitrario almacena cosas usando una base de potencia de dos, el tiempo por dígito requerido para convertir a/desde formato decimal aumentará a medida que N se hace más grande. – supercat

+0

@nubok: es cierto hasta que trabaje con enteros. Pero si cambias a números reales, la representación binaria apesta, eso es lo que llamas Float. – karatedog

4

BCD existe en las CPU modernas x86 ya que estaba en el procesador 8086 original, y todas las CPU x86 son compatibles con 8086. Las operaciones de BCD en x86 se usaron para respaldar aplicaciones comerciales en ese momento. El soporte de BCD en el procesador ya no se usa realmente.

Tenga en cuenta que BCD es una representación exacta de números decimales, que punto flotante no lo es, y que implementar BCD en hardware es mucho más simple que implementar punto flotante. Este tipo de cosas importaban más cuando los procesadores tenían menos de un millón de transistores que funcionaban a unos pocos megahercios.

+0

@Michael: No recuerdo las instrucciones x86 para BCD. ¿Me puedes recordar, por favor? –

+0

@John, puedo pensar en DAA, DAS (Ajuste decimal [después] Adición/Resta). Puede haber algunos otros, hace un tiempo que no jugué con eso ;-) – mjv

+0

@mjv: Gracias. Me había olvidado por completo de eso. Apenas recuerdo haber visto un ejemplo de usarlos, y ese no era un ejemplo del mundo real. –

6

BCD es útil en el extremo más bajo del espectro de la electrónica, cuando el valor en un registro se muestra en algún dispositivo de salida. Por ejemplo, supongamos que tiene una calculadora con varias pantallas de siete segmentos que muestran un número. Es conveniente si cada pantalla está controlada por bits separados.

Puede parecer inverosímil que un procesador x86 moderna se utiliza en un dispositivo con este tipo de pantallas, pero 86 se remonta un largo camino y la ISA mantiene una gran cantidad de compatibilidad con versiones anteriores.

+0

Esta es la mejor respuesta. Mostrar un número que no sea BCD en pantallas de 7 segmentos o similares es una pesadilla lógica. –

1

Estoy seguro de que el artículo de Wiki vinculado al anterior entra en más detalles, pero utilicé BCD en la programación de mainframe de IBM (en PL/I). BCD no solo garantizaba que podía mirar áreas particulares de un byte para encontrar un dígito individual, lo que a veces es útil, sino que también le permitía al hardware aplicar reglas simples para calcular la precisión y la escala requeridas, p. agregando o multiplicando dos números juntos.

Como recuerdo, me dijeron que en mainframes, el soporte para BCD se implementó en hardware y en ese momento, era nuestra única opción para representar números en coma flotante. (¡Estamos hablando de 18 años aquí!)

+0

Algunos formatos de punto flotante para el 6502 se basan en decimales. El software KIMath de MOS technologies (publicado en forma impresa) utilizó mantisa decimal sin embalaje con exponente binario para el cálculo y decimal empaquetado para el almacenamiento. – supercat

+0

Utilicé BCD para integrar sistemas de PC y mainframe en ese momento. – olivecoder

1

Cuando estaba en la universidad hace más de 30 años, me dijeron las razones por las que BCD (COMP-3 en COBOL) era un buen formato.

Ninguno de estos motivos sigue siendo relevante con hardware moderno. Tenemos una aritmética rápida y binaria de punto fijo. Ya no es necesario que podamos convertir el BCD a un formato visualizable agregando un desplazamiento a cada dígito BCD. Rara vez almacenamos números como ocho bits por dígito, por lo que el hecho de que BCD solo tome cuatro bits por dígito no es muy interesante.

BCD es una reliquia, y debe dejarse en el pasado, donde pertenece.

2

Hoy en día, es común almacenar números en formato binario y convertirlos a formato decimal para fines de visualización, pero la conversión lleva algo de tiempo. Si el objetivo principal de un número se muestra o se agrega a un número que se mostrará, puede ser más práctico realizar cálculos en formato decimal que realizar cálculos en binario y convertir a decimal. Muchos dispositivos con lecturas numéricas y muchos videojuegos almacenan números en formato BCD empaquetado, que almacena dos dígitos por byte. Esta es la razón por la que muchos contadores de puntaje se desbordan en 1,000,000 puntos en lugar de algún valor de potencia de dos. Si el hardware no facilita la aritmética BCD empaquetada, la alternativa no sería usar binario, sino usar decimal sin empaquetar. La conversión de BCD empaquetado a decimal desempacado en el momento en que se muestra puede hacerse fácilmente un dígito a la vez. Por el contrario, la conversión de binario a decimal es mucho más lenta y requiere operar en toda la cantidad.

Por cierto, el conjunto de instrucciones 8086 es el único que he visto con instrucciones para "Ajuste ASCII para División" y "Ajuste ASCII para Multiplicación", uno de los cuales multiplica un byte por diez y el otro por diez. Curiosamente, el valor "0A" es parte de las instrucciones de la máquina, y sustituirlo por otras hará que esas instrucciones se multipliquen o dividan por otras cantidades, pero las instrucciones no están documentadas como instrucciones de uso general de multiplicar/dividir por constante . Me pregunto por qué esa característica no fue documentada, dado que podría haber sido útil.

También es interesante observar la variedad de enfoques de los procesadores utilizados para sumar o restar BCD empaquetados. Muchos realizan una adición binaria, pero utilizan una bandera para realizar un seguimiento de si se produjo un acarreo del bit 3 al bit 4 durante una adición; entonces pueden esperar que el código limpie el resultado (por ejemplo, PIC), proporcionen un código de operación para la adición de la limpieza pero no la resta, suministren un código de operación para limpiar la suma y otro para la resta (por ejemplo, x86) o utilicen una bandera para rastrear si la última la operación fue suma o resta y utiliza el mismo código de operación para limpiar ambos (por ejemplo, Z80). Algunos usan códigos de operación separados para la aritmética de BCD (por ejemplo, 68000), y algunos usan un indicador para indicar si las operaciones de adición/sustracción deben usar binario o BCD (por ejemplo, derivadas de 6502). Curiosamente, el original 6502 realiza cálculos BCD a la misma velocidad que las matemáticas binarias, pero los derivados CMOS de este requieren un ciclo extra para las operaciones BCD.

+0

En x87 también hay ['FBLD' y' FLSTP'] (https://courses.engr.illinois.edu/ece390/archive/spr2002/books/labmanual/inst-ref-fbld.html) para cargar y almacenar Números de BCD. Algunas arquitecturas modernas tienen soporte de hardware para flotación decimal como Power6 e IBM z10 –

0

Muy pocos humanos pueden medir cantidades expresadas en hexa, por lo que es útil mostrar o al menos permitir ver el resultado intermedio en decimales. Especialmente en el mundo financiero o contable.

+0

recuerde que la pregunta es acerca del ensamblador "tipo de datos". en bajo nivel no tiene demasiado sentido usar BCD y ese es el núcleo de mi pregunta. hoy la mayor parte del desarrollo de software se realiza con lenguajes de alto nivel que mostrarán información en forma legible por humanos. – llazzaro

+0

Lo veo más como una cuestión de firmware. No puede sentarse frente a una máquina y esperar más de 3 segundos para obtener una respuesta. Al final, es la respuesta que obtiene el usuario final lo que realmente importa. – user3237507

0

La informática moderna ha enfatizado la codificación que captura la lógica de diseño en lugar de optimizar algunos ciclos de CPU aquí o allá. El valor de la hora y/o memoria guardada a menudo no vale la pena escribir rutinas especiales a nivel de bit.

Dicho esto, BCD todavía es de vez en cuando útil.

El único ejemplo en el que puedo pensar es cuando tienes una gran base de datos de archivos planos u otros big data que están en un formato ASCII como CSV. BCD es increíble si todo lo que haces es buscar valor entre algunos límites. Convertir todos los valores mientras escanea todos esos datos aumentaría en gran medida el tiempo de procesamiento.

Cuestiones relacionadas