Duda de punteros y desplazamiento

Duda de punteros y desplazamiento

de Rossana Guerra Celano -
Número de respuestas: 11
Hola, en una de las transparencias en un ejemplo de interrupciones, está el ejemplo de un LED controlado por un TIMER:

;indico desplazamiento y segmento
mov word ptr es:[bx+8*4],offset TIMER
mov word ptr es:[bx+8*4+2],cs

1- Cuándo se guarda en 'ptr'? estaría mal guardar el offset en un registro de uso general?

2- Por qué se multiplica por 4 y se suma 2 en vez de 1? al sumar 2 no asumo que es de 32 bits?

Gracias
En respuesta a Rossana Guerra Celano

Re: Duda de punteros y desplazamiento

de Gonzalo Tejera -
Hola.

1. no, si te fijas los operandos están en modo indirecto por los []. Estás almacenando desplazamiento y segmento en memoria (en el vector de interrupciones). No entiendo entiendo bien la segunda parte de la pregunta.

2. estás almacenado una nueva dirección de salto al manejador de interrupciones, estas direcciones son segmentadas y se colocan en un lugar determinado del vector de interrupciones. El *4 es para avanzar dentro del vector de elementos (en el vector de interrupciones), cada elemento es una dirección segmentada que ocupa 4 bytes. El +2 es para moverse 2 bytes en el vector para colocar los 16bytes del desplazamiento, la granularidad de la memoria en 8086 es byte (te moves de a bytes cuando das una dirección).

Saludos, Gonzalo
En respuesta a Gonzalo Tejera

Re: Duda de punteros y desplazamiento

de Rossana Guerra Celano -
1 - si hubiera estado mal asignar el offset a dx, eso preguntaba, pero tal vez eso no almacene la rutina de atención en memoria. No entiendo bien la directiva ptr.

2- clarisimo

gracias!
En respuesta a Rossana Guerra Celano

Re: Duda de punteros y desplazamiento

de Gonzalo Tejera -
Para qué querés almacenar el offset en DX? 

La directiva ptr dice si la dirección de memoria es un puntero a byte (byte prt) o a word (word ptr), o sea, determina si el operando que se trae de memoria es un byte o una palabra.

Saludos, Gonzalo
En respuesta a Gonzalo Tejera

Re: Duda de punteros y desplazamiento

de Juan Sebastian Korenko Crisera -
Una duda cuando ponemos offset TIMER, el TIMER seria el nompre de nuestro procedimiento no?
Otra cosa el segmente del mismo es siempre cs? O cuando varia nuestro segmento?


Otra cosa que no me queda del todo claro en el ejemplo es
cuando ponemos
cantTics db 0
estadoLED db 0

eso en realidad son variables en forma de byte no que inicializa en 0 no?

cuando ponemos CS:[cantTics]
y CS:[estadoLED]
no estamos accediendo a la misma posicion de memoria?

Gracias
En respuesta a Juan Sebastian Korenko Crisera

Re: Duda de punteros y desplazamiento

de Gonzalo Tejera -
Hola. En el curso vamos a asumir que el código de los manejadores y las variables globales se almacenan en un mismo segmento (CS cuando estamos ejecutando). Si fueramos al detalle esto queda determinado por las directivas assembler para la definición de segmentos, el tipo de código generado y el cargador del sistema operativo.

1. Sí, donde dice TIMER va el nombre del manejador.
2. En los ejemplos vamos a trabajar con CS, pueden usar la directiva segment también.
3. Define (los dos DB) dos variables de memoria consecutivas cada una ocupando un byte e inicializadas en cero.
4. Al poner en nombre de la variable entre [ ] es equivalente a poner offset de la variable. Al acceder a la memoria con dos nombres diferentes de variables con el DB no se solapan.

Saludos, Gonzalo
En respuesta a Gonzalo Tejera

Re: Duda de punteros y desplazamiento

de Gonzalo Daniel Waszczuk Bittencourt -
Hay unas cosas que no me quedaron claro en la parte del "move byte pty CS:[cant_tics],0".

1-No se tendría que usar DS ya que se trata de un dato?

2-Al hacer CS:[cantTics] se accedería a la dirección de memoria absoluta CS*16+cantTics. Al hacer CS:[estadoLED] se accedería a la dirección de memoria CS*16+estadoLED, correcto?

Si ambos canTics y estadoLED se definen en 0, entonces no accederian ambas a la direccion de memoria absoluta CS*16?



En respuesta a Gonzalo Daniel Waszczuk Bittencourt

Re: Duda de punteros y desplazamiento

de Gonzalo Tejera -
1-las variables estáticas por razones históricas asumimos que se almacenan en el CS. Los registros de segmento apuntan a la memoria, que hay en ese lugar es responsabilidad del programador y/o del SO.

2- CS*16+offset(cantTics) y CS*16+offset(estadoLED), se refiere al offset dentro del segmento en el que se definió no al contenido de la variable.

Saludos, Gonzalo.

En respuesta a Gonzalo Tejera

Re: Duda de punteros y desplazamiento

de Gonzalo Daniel Waszczuk Bittencourt -
1-A ta me quedó claro

2-No me quedó muy claro eso.

SI definís "cantTics db 0" y "estadoLED db 0", ¿cómo queda "offset(cantTics)" y "offset(estadoLED)"?
En respuesta a Gonzalo Daniel Waszczuk Bittencourt

Re: Duda de punteros y desplazamiento

de Gonzalo Tejera -
Hola.

2-cuando colocas una variable entre [] el ensamblador obtiene el desplazamiento (offset) de la variable y lo sustituye en el lugar del nombre de la variable.

Saludos, Gonzalo
En respuesta a Gonzalo Tejera

Re: Duda de punteros y desplazamiento

de Gonzalo Daniel Waszczuk Bittencourt -
Ah, yo entendía que la variable funcionaba como un inmediato.

O sea que cuando hacés "cantTics db 0", lo que hacés es poner el valor 0 en la dirección de memoria CS:offset(cantTics), no?
Y cuando hacés CS:[cantTics] solo usas el offset?


Esto funciona siempre con la directiva "db"?
Y si es el caso, cómo hace el ensamblador para calcular el offset de tal variable? Se lo atribuye al azar?
En respuesta a Gonzalo Daniel Waszczuk Bittencourt

Re: Duda de punteros y desplazamiento

de Gonzalo Tejera -
O sea que cuando hacés "cantTics db 0", lo que hacés es poner el valor 0 en la dirección de memoria CS:offset(cantTics), no?

Sí, inicializas el contenido de la variable en memoria con el valor cero.

Y cuando hacés CS:[cantTics] solo usas el offset?

Solo CS:cantTics te da la dirección segementada de la variable cantTics. Si agregas los [] ya estás accediento al contenido en memoria.

Esto funciona siempre con la directiva "db"?

Sí, habría que definir mejor "Esto".

Y si es el caso, cómo hace el ensamblador para calcular el offset de tal variable? Se lo atribuye al azar?

Tenes directivas assembler no vistas en el curso para definirlo. Si te interesa podes consultar las directivas offset, segment, assume, entre otras.

Saludos, Gonzalo