Segmenos por defectos para variables definidas con db/dw

Segmenos por defectos para variables definidas con db/dw

de Hugo Sebastian Rodriguez Reyes -
Número de respuestas: 3

Hola, tenia entendido que si tenes que compilar en 8086 un programa en alto nivel que tiene un main y tiene interrupciones, si vos te definiste una variable mediante la directiva db/dw el segmento por defecto en el main no es el mismo que en de la interrupcion.

El segmento por defecto para la variable en el main tenia entendido que era el DS y en la interrupcion el CS, es correcto esto?

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: Segmenos por defectos para variables definidas con db/dw

de Gustavo Brown -

Para problemas que no involucren interrupciones, las variables definidas mediante DB/DW, etc se asumen que están en el segmento DS. Es decir que si ejecutas tu programa y no modificas DS entonces las variables efectivamente van a estar accesibles en dicho segmento.

Para problemas de interrupciones las variables definidas mediante DB/DW se asumen que están en el segmento CS.

La razón de esto es que cuando se ejecuta la interrupción lo único conocido es CS e IP, y DS a priori podria tener cualquier valor.

El tema de fondo no se ve en este curso (se ve en Sistemas Operativos) y está relacionado con quién carga el programa en memoria para poder ponerlo a ejecutar. El ensamblador y el cargador deben estar "de acuerdo" sobre ciertas cosas para que todo funcione bien. Para el caso de programas que no implementan rutinas de atención a interrupciones deben suponer que el ensamblador esta "de acuerdo" con quien carga el programa para ponerlo a ejecutar para que las variables estén en el segmento DS (suponiendo que el programador no cambia el valor de dicho segmento) y para el caso en que haya rutinas de interrupción, se ponen de acuerdo en que el segmento usado sea CS.

Saludos,
   Gustavo

En respuesta a Gustavo Brown

Re: Segmenos por defectos para variables definidas con db/dw

de Hugo Sebastian Rodriguez Reyes -

Y en el caso que el programa no involucre interrupciones y yo haya modificado el segmento DS, en que segmento quedan accesibles las variables definidas mediante DB/DW?

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: Segmenos por defectos para variables definidas con db/dw

de Gustavo Brown -

Las variables siempre estan accesibles a través de una dirección segmentada "Segmento:Desplazamiento", el tema es que para poder acceder a ellas debés cargar alguno de los registros de segmento con el número de segmento adecuado y luego darle el desplazamiento correcto para realizar el acceso a memoria.

El ensamblador calcula automáticamente el desplazamiento (respecto del valor "original" de DS) en tiempo de ensamblado. Ese desplazamiento (junto con el identificador de registro de segmento queda embebido en la propia instrucción; en el caso de los segmentos por defecto éstos no quedan en la propia instrucción para ahorrar algunos bits).

El punto es que si tu cambias el valor del registro de segmento que usa la instrucción que accede a la variable para otra cosa, luego al ejecutar la instrucción vas a ir a buscar el dato a la dirección absoluta equivocada.

Por lo tanto en el caso del ejemplo, si modificas el valor de DS la instrucción va a ir a cualquier lado; debés volver a darle el valor correcto al registro de segmento para que la instrucción vaya a la dirección de memoria que quieras.

Ejemplo:

  Si tengo esta instrucción: 

     mov AX, [miVar]

y miVar esta definida como

miVar dw 1234

entonces si no tocas DS vas a ir correctamente a buscar el contenido de la variable.

Si modificas DS vas a ir a cualquier lado (a donde apunte DS:offset mivar en ese momento), por lo que antes de ejecutar dicha instruccion deberias recuperar el valor de DS (por ejemplo lo podías haber puesto en el stack y lo popeas antes de ejecutar la instrucción).

Saludos,
  Gustavo