[2021][Simulacro][Problema 5]

[2021][Simulacro][Problema 5]

de Pablo Palou Singlet -
Número de respuestas: 5

Buenas!

No me queda clara la siguiente línea:

"rango_sensor DB 512 dup(0)"

No se estarían perdiendo los datos que yo tengo en rango_sensor al hacer tal declaración? Según tengo entendido eso hace 512 bytes incializados en 0, por lo que me parece que se perdería la información.

Si es que esta manera no es efectiva, cómo puedo acceder al índice de rango_sensor? (En este caso al haberlo definido como "rango_sensor DB 512 dup(0)" puedo hacer como se hace en la solución "[rango_sensor+BX]" ).

Desde ya, muchas gracias.


En respuesta a Pablo Palou Singlet

Re: Solución Ejercicio 5 Simulacro

de Guillermo Daniel Toyos Marfurt -
No se estaría perdiendo nada porque ni siquiera se puede ensamblar me parece. La sintaxis para declarar memoria es [nombre] (DB|DW|DDW*) [DUP(cant)] (valor1)[,valor2]...
Supongo que la idea era asignar 512 bytes y llamarle a esas direcciones rango_sensor. Dup(0) supongo que es para dar la idea que no se esta asignando nignún valor a las direcciones? De todas maneras esto no es asembler (por lo menos en ArquiSim no compila) y el ejercicio pide que elaboramos algo que compile...

La letra (y la solución!) da a entender que la maquina es dedicada. Pero nos dice que esa estructura ya la tenemos y está *cargada*. Pero de donde sale si al compilar uno está definiendo todo lo que la CPU va a realizar? Creo que ahi surge la contradicción. No debería suponerse que la estructura ya está cuando estamos ensablamando para una cpu dedicada no? También esta el hecho que no tenemos los datos como para cargarla, por lo que habría que hacer algo al estilo pseudo-instrucción como "//cargarISR" tanto en C como en assembly.

La solución que propongo para las rutinas es la siguiente:

En C:
void main(){
//InstalarISR's
//CargarDatos en rango_sensor
while true(1);
}

Y en 8086:
rango_sensor EQU ... ;direccion donde estará el arreglo.
main proc
xor ax,ax
mov es,ax
mov word ptr es:[D_CEDULA],0xF
mov word ptr es:[D_CEDULA,0xFFF
; SE CARGA EN LA MEMORIA LOS DATOS DEL ARREGLO rango_sensor
sti;
loop:
jmp loop
main endp

Luego se puede cargar rango_sensor a un registro y usarlo como bx+offset para acceder al arreglo.

Podrían los profesores explicar un poco como encarar esta problematica? (O dar a entender por qué la solución está bien)
Desde ya gracias!!!

PS: Pablo, si haces var1 DB 0xFF. Luego podes en el codigo hacer mov al,[var1+bx] y obtener el dato. Cuando se pasa a codigo de maquina var1 es como el offset creo
En respuesta a Pablo Palou Singlet

Re: Solución Ejercicio 5 Simulacro

de Gonzalo Tejera -

Hola, esa línea reserva un área de memoria de forma estática para alojar al arreglo de rango_sensor.

No estás perdiendo datos pues hasta que no se reserva la memoria la estructura no existe ni puede accederse (al menos respetando buenas prácticas de programación).

Es cierto que con esa definición estás inicializando toda la estructura en cero por lo que dependes de una inicialización posterior con valores adecuados. Esto escapa al problema pero podría resolverse de alguna de las siguientes maneras:

* inicializarlo estáticamente al momento de declarar la variable

* inicializarlo dinámicamente al principio del main.

* si la maquina no fuera dedicada se podría usar un procedimiento para inicializar o cambiar los valores de la estructura

* por último se puede usar algún mecanismos de E/S para recibir los valores del rango y ajustar la estructura usando polling o interrupciones

Saludos, Gonzalo


En respuesta a Gonzalo Tejera

Re: Solución Ejercicio 5 Simulacro

de Guillermo Daniel Toyos Marfurt -
Perdón la insistencia, pero es "rango_sensor DB 512 dup(0)" una directiva valida? En ArquiSim no compila y en las slides del curso la sintaxis es otra
En respuesta a Guillermo Daniel Toyos Marfurt

Re: Solución Ejercicio 5 Simulacro

de Gustavo Brown -
Guillermo,
El formato en el Arquisim es el siguiente:
etiqueta DB dup(cantidad) valor_inicial

O sea que para que lo acepte el arquisim deberia decir
rango_sensor DB dup(512) 0

Igualmente se entiende sin problemas la otra definición. Esa es una directiva del ensamblador y mientras se entienda no habría problema.

Hay otro par de detalles que hacen que no "compile" en el arquisim, por ejemplo la suma de constantes directo en una instrucción no está soportada. Pero de nuevo eso sería algo del ensamblador y no intrínseco de 8086. 
Y hay una asignación que está mal (MOV DX, AH), debería cambiarse por MOV DL, AH y XOR DH, DH
Ah, y un bug por el cual DATA_SENSOR no es un nombre valido de etiqueta.

Aqui estaría el código compilable:

.data  ; Segmento de datos
DATO_SENSOR EQU 10
VALVULAS EQU 2
D_CEDULA EQU 3
MASK_CTRL_VALVULA EQU 1 << D_CEDULA
VALVULAS_MAS_CEDULA EQU VALVULAS+D_CEDULA
;rango_sensor DB 512 dup(0)
rango_sensor DB dup(512) 0
.code  ; Segmento de código
main proc
 xor ax,ax
 mov es,ax
 mov word ptr es:[D_CEDULA], 0xF
 mov word ptr es:[D_CEDULA+2], 0xFFF
 sti; {habilitoInterrupciones}
 loop:
 jmp loop
 ret ; para que no moleste el arquisim
main endp

new_data_from_sensor proc far
 mov DX, DATO_SENSOR
 in AX, DX ; lee puerto de E/S para obtener la informacion del sensor
 xor BH, BH
 mov BL, AH
 SHL BX, 1 ; multiplico por el tamaño del elemento de la estructura
 mov DX, [rango_sensor+BX]
 cmp AL, DL
 jae else
 mov DL, AH ; cierra la valvula
 xor DH, DH
; add DX, VALVULAS+D_CEDULA
 add DX, VALVULAS_MAS_CEDULA
 mov AX, 0
 out DX, AX
 jmp fin
else:
 mov DL, AH ; abre la valvula
 xor DH, DH
 add DX, VALVULAS_MAS_CEDULA
 mov AX, MASK_CTRL_VALVULA
 out DX, AX
fin:
iret
new_data_from_sensor endp


Saludos,
  Gustavo