[2020][Julio][Problema 1]

[2020][Julio][Problema 1]

de Augusto Alonso Novo -
Número de respuestas: 6

Hola,

En el problema 1.b del exámen de Julio 2020 se tiene el siguiente código en 8086
mov CL, BL
and CL, 0xF
cmp CL, 10
jb fin_if1

Cuál es el motivo del `and CL, 0xF` y el `cmp CL, 10`?


En respuesta a Augusto Alonso Novo

Re: Problema 1.b Julio 2020

de Gustavo Brown -
Augusto,
Está compilando el código C de la parte anterior, más especificamente donde dice

   if(bcdB & 0xF > 9)
         bcdB += 6;

en BL tiene bcdB
entonces
mov CL, BL  ; copia en CL bcdB para poder hacer la comparación sin perder bcdB
and CL, 0xF ; es la parte izquierda de la comparación
cml CL, 10 ; es la parte derecha de la comparación
jb fin_if1;  salta al fin del if si no se cumple la condición

compara con 10 en vez de con 9 porque el "compilador" en vez de comparar por menor o igual (jbe fin_if1) comparó por menor (jb fin_if1)

o sea, en vez de como esta en la solución se podría haber puesto
mov CL, BL
and CL, 0xF
cmp CL, 9
jbe fin_if1


Saludos,
  Gustavo
En respuesta a Gustavo Brown

Re: Problema 1.b Julio 2020

de Santiago Gongora De La Fuente -
Gustavo ¿cómo estás? Tengo una duda sobre esta solución.

Entiendo que el bcdB+=6 (o bcdA+=6) se hace para que -si se llegó a la "zona" del BCD donde habitan las marcas de fin de la codificación (A,B,C,D,E,F) - entonces se saltee hasta que haya otro dígito válido. ¿Esto es así?

En ese caso ¿en qué estado queda la ROM si no se asigna nada a esas entradas? Por ejemplo, para:
bcdA = 0xCD
bcdB = 0xEF

¿Qué salida da la ROM? ¿Queda sin inicializar?

Mi intuición me dice que debería quedar en 0 o en alguna marca del estilo "entradas inválidas".

Muchísimas gracias por adelantado.
Saludos,
Santiago
En respuesta a Santiago Gongora De La Fuente

Re: Problema 1.b Julio 2020

de Santiago Correa Perini -
Santi, me meto acá, a mi me costo entender y de paso pregunto si entendi bien, porque me cerró el razonamiento.

No se que pasa con esas entradas, porque en realidad el programa de la solución nunca las carga (no permite que se formen 0xCD ni 0xEF por ejemplo). El bcdB +=6, lo mismo para el bcdA, es para que, cómo decis, cuando representa más de un digito en el nibble (10,11,12,13,14,15), sumes en la decena un 1 (es decir en el segundo nibble), dejando correctamente el remanente en el primer nibble (por eso hace el and con 0xF > 9).

6 en binario es 0110. Los casos en el que el nibble representa más de un digito son 1010, 1011, 1100, 1101, 1110, 1111. Sumandole a cada uno 6 te deja 0x10, 0x11, 0x12, 0x13, 0x14, 0x15. ¿Está bien? ¿Entendiste lo mismo Santi? Igual me queda la duda también de que pasa con las entradas que nunca se forman.

Saludos
En respuesta a Santiago Correa Perini

Re: Problema 1.b Julio 2020

de Santiago Gongora De La Fuente -

Santi,

entendemos lo mismo, creo, sí. Como la carga de la ROM se hace de manera iterativa-incremental en los posibles valores de los BCD(a y b), cuando se toma el caso de que el BCD ya no representa un dígito (10,11,12,13,14,15) se le suma 6 para poder ir al "0". Pero fijate que a 11,12,13,14 y 15 nunca se le suma 6; solo pasa con el 10 (por ser iterativo).

O sea, el ">9" se puede comportar como un (==10), porque al ser incremental, una vez que se entra en ese caso, ya se saltea toda esa zona.

Lo que comentás de que la solución nunca las carga, es verdad, lo entiendo así también. Pero justamente, para esas entradas no va a haber una salida - a priori codificada - en la ROM. Mi pregunta iba en esa dirección ¿Qué pasa en ese caso? ¿Puede quedar basura? ¿Habría que dejarlo con alguna marca especial?

En respuesta a Santiago Gongora De La Fuente

Re: Problema 1.b Julio 2020

de Gustavo Brown -
Hola,
En ese ejercicio la solución únicamente carga las direcciones asociadas a entradas válidas (en el sentido de que representan números BCD empaquetados de 2 dígitos).
Las demás direcciones no importa que valor tengan asociado porque no está definido en la letra que poner como salida para entradas que no se corresponden con números BCD de 2 dígitos.

Si la letra dijese que para entradas que no se corresponden con números BCD se debería dejar cierto valor entonces en la solución habría que hacer los cambios apropiados.

Saludos,
Gustavo