[2013][Diciembre][Problema 1]

[2013][Diciembre][Problema 1]

de Gaston Daniel Barreto Sugliani -
Número de respuestas: 5

https://eva.fing.edu.uy/pluginfile.php/44683/mod_folder/content/0/2013/solExArqComp20131223.pdf?forcedownload=1


Que significan en el codigo en c de la solucion? no entiendo el **
define MOTOR_FINISH 2**15
 define LRF_START 2**7


y la sentencia iter de la solucion en 8086?
proc far lrfFinish
mov [CS:readOK], true
iter
endp



En respuesta a Gaston Daniel Barreto Sugliani

Re: Problema 1 Examen Diciembre 2013

de Gustavo Brown -

** quiere decir "elevado a", tal vez hubiese sido mejor poner ^

O sea, MOTOR_FINISH es una constante de valor 32768 (2 elevado a la 15) y LRF_START viene a ser 128 (2 elevado a la 7).

Donde dice iter debió decir iret (estimo un error del autocorrector)

Saludos,

  Gustavo

En respuesta a Gustavo Brown

Re: Problema 1 Examen Diciembre 2013

de Andres Bello Ureta -

Tengo una duda con respecto al mismo pedazo de codigo de assembler que pone el compañero.

En la instrucción: mov [CS:readOk], true. Porque se elige el segmento CS y se almacena en memoria? no seria correcto almacenarlo en el segmento DS (donde se almacenan los datos)?. Si se hubiera almacenado en un registro, supongamos DX, seria incorrecta la solucion por estar sobreescribiendo el valor del registro?

Es buena práctica almacenar resultados globales en memoria?, como se que no lo van a sobreescribir?

Gracias!
En respuesta a Andres Bello Ureta

Re: Problema 1 Examen Diciembre 2013

de Gustavo Brown -

En el caso en que se involucren interrupciones, se utiliza CS como segmento para almacenar código y datos porque cuando ocurre la interrupción el único contexto conocido es el valor de los registros CS e IP. El registro DS va a tener el valor que tenia cuando se produjo la interrupción que no tiene por qué ser el que mapea la variable.

Es decir, las variables utilizadas por la interrupción se almacenan en el mismo segmentó donde está la propia rutina de interrupción, para de esta manera poder acceder a la variable. Esto normalmente se declara como directiva al ensamblador (no lo vemos en este curso; en este curso cuando hay interrupciones si declaras una variable en memoria ésta se asume que va al segmento de código).

Como toda variable global cualquiera puede sobreescribirla, no importa en qué segmento este ubicada.

Utilizar un registro para mantener la variable global en general es muy mal idea, porque ese registro pasaría a ser de uso exclusivo para esa variable (no podria usarlo en el código de main o subrutinas porque la interrupcion puede producirse en cualquier momento)

Saludos,
   Gustavo