[2021][Simulacro][Problema 5]

[2021][Simulacro][Problema 5]

de Esteban Gabriel Risso Martinez -
Número de respuestas: 18

Buenas, me surgieron algunas dudas haciendo el assembler de la interrupción. En cierta parte de la interrupción tengo:

if (dato < rango_sensor[id_sensor].min)

    OUT(VALVULAS+id_sensor,1);

1- la estructura  rango_sensor en que segmento esta y como accedo al índice id_sensor (necesitaría saber el desplazamiento de la estructura dentro del segmento) .

2- el assembler de OUT(VALVULAS+id_sensor,1) lo hice como:

      xor cx,cx

      mov cl,ah ;en ah tengo id_sensor 

      mov dx,VALVULAS

      add dx,cx

      out dx,1

esta bien?

Muchas gracias!

Saludos,

     Esteban.


En respuesta a Esteban Gabriel Risso Martinez

Re: ejercicio 5 - simulacro examen febrero 2021

de Marco Andres Baldi Monaco -
Agrego algo a la consulta: ¿Podrían subir un ejemplo de un ejercicio como este? No encuentro un ejemplo claro donde se tenga que guardar la interrupcion en un lugar especifico del vector de interrupciones. Desde ya, muchas gracias.
En respuesta a Marco Andres Baldi Monaco

Re: ejercicio 5 - simulacro examen febrero 2021

de Gonzalo Tejera -
Hola Marco, podes consultar las diapositivas de teórico al respecto. Por ejemplo en la página 37 de éstas https://eva.fing.edu.uy/pluginfile.php/84086/mod_resource/content/0/Presentaci%C3%B3n%208086%20parte%202.pdf

Saludos, Gonzalo
En respuesta a Gonzalo Tejera

Re: ejercicio 5 - simulacro examen febrero 2021

de Rodrigo Alain De La Vega Rodriguez -
Gonzalo, buenas tardes. El documento que sugerís lo vi varias veces pero no entiendo porque se cargaron de esa forma las constantes INT8_OFF y INT8_SEG. O sea, por que INT8_OFF es 8*4 y INT8_SEG es 8*4+2?
Gracias!
En respuesta a Rodrigo Alain De La Vega Rodriguez

Re: ejercicio 5 - simulacro examen febrero 2021

de Gonzalo Tejera -

En 8086 el vector de interrupciones se encuentra a partir de la dirección real 0 y cada elemento de ese vector almacena un puntero FAR (segmento : offset) a la dirección de la primera instrucción donde se encuentra cargado el manejador de la interrupción.

Entonces para acceder a un elemento de esa estructura se usa indice * tamaño de elemento (8 y 4, para ese ejemplo), luego el +2 es porque el tamaño del offset es dos bytes. Como 8086 es Little Endian primero aparece el offset y luego el segmento en el vector de interrupciones.

Saludos, Gonzalo

En respuesta a Rodrigo Alain De La Vega Rodriguez

Re: ejercicio 5 - simulacro examen febrero 2021

de Gustavo Brown -
Rodrigo,
El vector de interrupciones contiene punteros FAR al comienzo de la rutina que atiende cada interrupción.
Cada puntero FAR requiere 2 palabras (2 bytes para el desplazamiento y 2 bytes para el segmento).
El vector arranca en la dirección absoluta 0 de la memoria y contiene 256 punteros. Se almacena cada puntero FAR guardando el desplazamiento en las "direcciones" más bajas y luego el segmento. O sea que si tenes un registro de segmento con el valor 0, el desplazmiento para el comienzo de cada puntero en el vector se calcula como 4*número_de_interrupción para el desplazamiento y 4*número_de_interrupción+2 para el segmento.
En particular para la interrupción 8 eso te da 8*4=32 para el desplazamiento y 8*4+2=34 para el segmento.

Saludos,
Gustavo
En respuesta a Esteban Gabriel Risso Martinez

Re: ejercicio 5 - simulacro examen febrero 2021

de Santiago Correa Perini -
Buenas,
Al menos que tenga desactualizada la cartilla, OUT en el segundo parametro solo puede recibir AL/AX
Despues tengo la misma duda, sumada con la de Marco, en donde guardar el segmento (y cual) con el offset dentro de 0x0000 a 0x003FF
Saludos
En respuesta a Santiago Correa Perini

Re: ejercicio 5 - simulacro examen febrero 2021

de Rodrigo Alain De La Vega Rodriguez -
Hola, tengo las mismas dudas. Me tranque tratando de instalar las interrupciones ya que no entiendo bien como hacer lo del segmento y desplazamiento.
Se supone que si el identificador de la interrupción en el arreglo de interrupciones es mi dígito verificador (1 en mi caso) entonces debería usar eso y algo mas?

Ademas tengo algunas dudas respecto a mi código:

//DONDE DICE "ACA NO SE QUE PONER" ES DONDE ESTOY TRANCADO.
principal PROC
CLI ;DESHABILITO INTERRUPCIONES

;INDICO DESPLAZAMIENTO Y SEGMENTO

;SABIENDO QUE MI DIGITO VERIFICADOR ES 1 => LA POSICION EN EL ARREGLO
;DE INTERRUPCIONES ES LA 1
MOV WORD PTR ES:[ "ACA NO SE QUE PONER" ], OFFSET new_data_from_sensor
MOV WORD PTR ES:[ "ACA NO SE QUE PONER" ], CS

STI ;HABILITO INTERRUPCIONES
principal ENDP

Luego respecto al siguiente código tengo las siguientes dudas:
1) ESTA BIEN COMO SE CARGA EL CONTENIDO DE DATA_SENSOR?
2) ESTA BIEN LA FORMA QUE SE OBTIENE EL MIN Y EL MAX DE rango_sensor?

new_data_from_sensor PROC FAR
//PRESERVO EL CONTEXTO
MOV BP, SP ;BP = SP
PUSH AX;
PUSH BX;
PUSH CX;
PUSH DX;

MOV DX, DS:[DATA_SENSOR]
in(AX, DX) ;CARGO TODA LA PALABRA, AH = idSensor y AL = dato

MOV DX, VALVULAS
ADD DX, 0x0001 ;MI DIGITO VERIFICADOR

XOR BX,BX
MOV BL, AH ;PASO EL id del sensor

MOV CL, BYTE PRT DS:[BX] ;CARGO EN CL EL MINIMO DEL SENSOR EN CUESTION
MOV CH, BYTE PRT DS:[BX+1] ;CARGO EN CH EL MAXIMO DEL SENSOR EN CUESTION
cerrar:
CMP AL, CL ;COMPARO SI EL DATO ES MENOR QUE EL MINIMO
JAE abrir ;SI ES MAYOR O IGUAL

MOV AX, 0x0002 ;SE SUPONE QUE HAY QUE PONER EN 1 EL BIT DE MI DIGITO VERIFICADOR
OUT(DX, AX)

JMP fin

abrir:
CMP AL, CH ;COMPARO SI EL DATO ES MAYOR QUE EL MAXIMO
JBE fin ;SI ES MENOR O IGUAL

MOV AX, 0x0000 ;SE SUPONE QUE HAY QUE PONER EN 0 PARA ABRIR LA VALVULA
OUT(DX, AX)

JMP fin

fin:
POP DX
POP CX
POP BX
POP AX
IRET

new_data_from_sensor ENDP


Gracias! Saludos
En respuesta a Santiago Correa Perini

Re: ejercicio 5 - simulacro examen febrero 2021

de Gonzalo Tejera -
Hola Santiago, es correcto lo que decís respecto de OUT (sólo se puede indicar el valor a escribir en AL o AX)

Sobre el offset de la estructura de datos, supongo que la declaraste con un DB y un DUP, una vez hecho esto podes usar el nombre de la variable usad para el DB como el offset-

Saludos, Gonzalo
En respuesta a Gonzalo Tejera

Re: ejercicio 5 - simulacro examen febrero 2021

de Santiago Correa Perini -
Gracias Gonzalo

En realidad me refería a como hacer uso del dato que la rutina a implementar (new_data_from_sensor) se encuentra en la dirección absoluta 0xFFFF. En mi caso, mi digito verificador es 8, por lo tanto debería guardar el segmento de la rutina en la dirección 8*4 y el offset de la rutina en 8*4 + 2. Combinando estos datos, implicaria que (suponer que en ES está 0 y en BX también):
SEG equ 8*4
OFFS equ 8*4 + 2
mov word ptr es:[bx + SEG], 0xFFFF
mov word ptr es:[bx + OFFS], offset new_data_from_sensor

O en es:[bx + SEG] siempre va CS?
En respuesta a Santiago Correa Perini

Re: ejercicio 5 - simulacro examen febrero 2021

de Gonzalo Tejera -

La letra te indica que el manejador de interrupciones new_data_from_sensor se encuentra cargado en esa dirección absoluta por lo que para este caso no es válido usar CS y offset new_data_from_sensor como los valores a cargar en el vector de interrupciones.

El problema es cómo transformas la dirección absoluta dada en una dirección segmentada para guardar en el vector de interrupciones?

En respuesta a Gonzalo Tejera

Re: ejercicio 5 - simulacro examen febrero 2021

de Santiago Correa Perini -
Cierto

Cualquier combinación que sume 0xFFFF es valida? Por ejemplo:
mov word ptr es:[bx + SEG], 0xFF00
mov word ptr es:[bx + OFFS], 0x00FF

Gracias de antemano
En respuesta a Santiago Correa Perini

Re: ejercicio 5 - simulacro examen febrero 2021

de Federico Rivero -
Importante aclarar que el ejemplo ese no funciona.

Si ponés en el segmento 0xFF00 y en el desplazamiento 0x00FF, la dirección efectiva es 0xFF0FF

(Recordar cómo se forman las direcciones absolutas en 8086)

Saludos,
Federico
En respuesta a Federico Rivero

Re: ejercicio 5 - simulacro examen febrero 2021

de Santiago Correa Perini -
Si, SHL 4 veces el segmento + dirección indicada. Interprete que dirección absoluta es distinto de dirección física, más siendo que se expreso la dirección en la letra con 16bits. Gracias.
En respuesta a Santiago Correa Perini

Re: ejercicio 5 - simulacro examen febrero 2021

de Gustavo Brown -
Santiago,
La letra te dice que la rutina se encuentra en la dirección absoluta 0xFFFF, así que deberías guardar en el vector de interrupciones (en tu caso en la posición asociada a la interrupción 8) un segmento y un desplazamiento que conformen la dirección efectiva 0xFFFF, dejándole lugar para que la rutina pueda hacer algo (al menos un jmp far).
Por ejemplo podrías usar como segmento 0x0FFF y como desplazamiento 0xF

mov word ptr es:[SEG], 0x0FFF
mov word ptr es:[OFFS], 0xF

Saludos,
Gustavo
En respuesta a Esteban Gabriel Risso Martinez

Re: ejercicio 5 - simulacro examen febrero 2021

de Rodrigo Alain De La Vega Rodriguez -
Hola! Tratando de hacer el ejercicio creo que puedo comentar algo. Si estoy equivocado espero que algún profesor me corrija.

1- La estructura rango_sensor es un arreglo de 256 posiciones donde cada posición ocupa 2 bytes de memoria, por lo tanto en la posición rango_sensor[0] (baja) tendrás el mínimo de ese id sensor y en rango_sensor[0] (alta) el máximo.
Ahora se supone que en lo apuntado por DATO_SENSOR obtuviste el id sensor, entonces ya con eso podes resolver como tomar la info y compararla. Luego respecto al segmento, me parece que se asume DS.
En respuesta a Esteban Gabriel Risso Martinez

Re: ejercicio 5 - simulacro examen febrero 2021

de Gonzalo Tejera -
Hola Esteban, sobre tus dudas:
1. en caso que no se indique para estructuras de datos se asume por defecto DS como registro de segmento. El índice del sensor viene como dato en la información que recibís en el puerto de entrada DATA_SENSOR (capaz no entendí pues en el código en 2. haces uso de ese dato). Capaz querés acceder a rango_sensor?
2. Operas de más para obtener la dirección en el espacio de entrada y salida pero está bien. Está mal lógicamente lo que haces pues tenes que considerar en dos oportunidades tu dígito verificador.

Saludos, Gonzalo