Segmenos por defectos para variables definidas con db/dw

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

de Gustavo Brown -
Número de respuestas: 0

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