[2021][Simulacro][Ejercicio 5]

[2021][Simulacro][Ejercicio 5]

de German Moreira Bellini -
Número de respuestas: 10

Buenas tengo una duda con este ejercicio, en la letra se pide:

"Compile a 8086 sabiendo que el identificador de la interrupción generada por los sensores es el dígito verificador de su cédula y la rutina new_data_from_sensor() se carga en la dirección absoluta 0xFFFF."

Y luego en la solucion se hace:

D_CEDULA EQU ...

mov word ptr es:[D_CEDULA], 0xF
mov word ptr es:[D_CEDULA+2], 0xFFF

No deberia ser guardarse en la direccion D_CEDULA EQU *4, ya que cada interrupcion en el vector ocupa 4 bytes?

Gracias.

En respuesta a German Moreira Bellini

Re: Ejercicio 5 simulacro 2021 assembler

de Gustavo Brown -
German,
Efectivamente la dirección base asociada al identificador D_CEDULA ésimo es D_CEDULA*4
O sea habría que poner algo de este estilo:

ISR_OFFSET EQU D_CEDULA *4
ISR_SEGMENT EQU D_CEDULA*4+2
...
mov word ptr ES:[ISR_OFFSET], 0xF
mov word ptr ES:[ISR_SEGMENT], 0xFFF

Corregimos la solución

Saludos,
Gustavo
En respuesta a Gustavo Brown

Re: Ejercicio 5 simulacro 2021 assembler

de German Moreira Bellini -
En respuesta a German Moreira Bellini

Re: Ejercicio 5 simulacro 2021 assembler

de Agustina Moraes Nuñez -
Buenas, me quedan un par de dudas de este ejercicio.
En la letra dice que "la válvula correspondiente a un sensor dado se acciona escribiendo en el bit cuyo número coincide con el dígito verificador de su cédula en la palabra de E/S, de solo escritura, en la dirección VALVULAS+i", entonces no entiendo por qué en la solución se acciona escribiendo en la dirección VALVULAS+i+D_CEDULA. Me queda claro que la interrupción tiene el identificador D_CEDULA pero no se si eso tiene algo que ver con que a la dirección VALVULAS+i se le sume este valor.
La otra duda es con respecto a la definición de la constante MASK_CTRL_VALVULA. Entiendo que en el código de la parte b, en ensamblador 8086, se defina esta constante como 1 SHL D_CEDULA, es decir, como la constante que tiene un 1 en el bit que corresponde al dígito verificador de la cédula. Pero no entiendo por qué en el código de alto nivel se define MASK_CTRL_VALVULA como 2**D_CEDULA, no sé si esto significa lo mismo que 1 SHL D_CEDULA y no estoy entendiendo la notación.
Gracias! Saludos
En respuesta a Agustina Moraes Nuñez

Re: Ejercicio 5 simulacro 2021 assembler

de Alexis Alfonso -
Buenas, tengo un poco las mismas dudas que Agustina. Al momento de escribir en el bit-digito-cedula en la dirección VALVULAS + i ¿no habría que mantener el valor de los restantes bits de la dirección incambiados haciendo una máscara con OR ? No me queda claro por qué simplemente suma el dígito de la cédula a VALVULAS + i


Gracias
En respuesta a Alexis Alfonso

Re: Ejercicio 5 simulacro 2021 assembler

de Federico Rivero -
Hola! Primero que nada quiero aclarar que acabo de actualizar la solución, la cual tenía un montón de errores. Algunos listados por ustedes y otros no. Ahora sí, voy contestando en orden:

entonces no entiendo por qué en la solución se acciona escribiendo en la dirección VALVULAS+i+D_CEDULA.

Era uno de los errores de la solución, ese + D_CEDULA no iba.

Sobre 2**D_CEDULA

En la solución se utilizaba esa notación, la cual pretendía simbolizar 2D_CEDULA. Esa notación no es válida en el curso, por lo tanto la cambié por 1 << D_CEDULA.

¿no habría que mantener el valor de los restantes bits de la dirección incambiados haciendo una máscara con OR? 

Esto no hay que hacerlo porque se indica que los registros de E/S de las válvulas son de solo escritura. Para poder hacer una máscara hay que poder leer el valor del registro (es decir, hacer un IN).

Saludos,
      Federico
En respuesta a Gustavo Brown

Re: Ejercicio 5 simulacro 2021 assembler

de Geronimo Mendez Ferreira -
Buenas, a mí me surge una duda. En este ejercicio, cuando escribimos el programa en alto nivel, asumimos como que rango_sensor ya está definido en memoria (que según la letra lo está), pero cuando se compila el código, en la solución se lo vuelve a definir, pero esta vez conteniendo todos 0s, como asumiendo que luego al acceder tendrá los valores correctos. ¿Esto se debería hacer siempre así? Supongo que se hace por simplificar nomás, pero no estoy seguro.
Gracias.
En respuesta a Geronimo Mendez Ferreira

Re: Ejercicio 5 simulacro 2021 assembler

de Gonzalo Tejera -

Hola Gerónimo.

La compilación hace lo que indicas, y no debería inicializarlo en cero. En todo caso, si lo inicializa en cero, debería incluir un comentario en el main que indique la carga de la estructura con valores de trabajo antes de habilitar interrupciones.

Saludos, Gonzalo

En respuesta a Gonzalo Tejera

Re: Ejercicio 5 simulacro 2021 assembler

de Geronimo Mendez Ferreira -
Gracias por la respuesta, ¿cuál sería entonces la mejor forma de encararlo? ¿Podría, al momento de compilar asumir que ya existe una estructura llamada rango_sensor con los valores y tamaño correcto sin necesidad de definirla? o es mejor hacer lo que decías? es decir, definirla, pero dentro del main proc, indicar con un comentario la carga de los valores.
En respuesta a Gustavo Brown

Re: Ejercicio 5 simulacro 2021 assembler

de Geronimo Mendez Ferreira -
Buenas Gustavo. Me surge otra pregunta respecto de esta parte, en el segundo mov, es realmente necesario especificar que es una palabra con "word ptr" lo que se quiere mover a la dirección ES:[ISR_SEGMENT] ? no se sobreentiende al ser el inmediato 0xFFF (que si o si debe ser de mas de 8 bits) ?
En respuesta a Geronimo Mendez Ferreira

Re: Ejercicio 5 simulacro 2021 assembler

de Federico Rivero -
Hola Gerónimo!

Está bien lo que planteás, es un argumento váilido y tiene sentido, pero en el contexto de este curso pedimos agregar ese WORD_PTR de todas formas, entre otras razones porque el Arquisim funciona de esa manera.

Saludos,
Federico