La Web del Programador: Comunidad de Programadores
 
    Pregunta:  8775 - DIRECCIONES DE MEMORIA ABSOLUTAS
Autor:  _cplusplus_ _c_
Hola.
Me gustaria saber como puedo acceder a una diireccion de memoria absoluta, es decir del tipo segmento:desplazamiento utilizando punteros normales de C. Con normales me refiero a no utilizar punteros tipo far, ni tampoco hacer uso de la macro MK_FP. Desde siempre esto lo he hecho con punteros tipo far, pero me gustaria seber como se hace con punteros
estandares por llamarlo de alguna forma.

Gracias a todos.

  Respuesta:  Googol Plex
No se puede.
En MS-DOS hay dos tipos de punteros, según el tipo de aplicación.
Los punteros \"near\" son aquellos que solo tienen el desplazamiento, porque el segmento está implícito. Por ejemplo, si tienes un puntero a una variable, en un programa pequeñito en el que solo se tiene un segmento de datos (64 Kb), el puntero será \"cercano\" (near), dando solo el desplazamiento en el segmento, que será el apuntado por DS.
Si la aplicación es más grande, y necesita más datos, tendrá más de un segmento, a si es que un puntero auna variable tiene que dar el segmento y el desplazamiento. Y para eso son los punteros far. Un puntero near ocupa un entero de 16 bits, para el desplazamiento; y un puntero far tendrá dos enteros de 16 bits, uno para el segmento y otro para el desplazamiento.
Lo que tú llamas \"punteros estandares\" ¿qué es? Si tú defines un puntero, sin especificar far o near, el puntero será cercano, o lejano, según el modelo de memoria en el que compiles el programa. Si tienes solo un registro para datos, será near; si tienes más será far.
Si quieres tener un puntero a una posición concreta, absoluta (por ejemplo a los vectores de interrupción, o a las variables de la BIOS) necesitas obligatoriamente un puntero lejano, que guarde el segmento y el desplazamiento.
Si tu aplicación solo usa un segmento de datos, tendrás que especificar que quieres el puntero a far. Si no, no hará falta (creo...).
La macro MK_FP lo único que hace es rellenarte el puntero. Éste es un par de enteros seguidos, con el segmento y el desplazamiento, y la macro lo único que hace es guardar los valores que le das en cada uno de los dos enteros. Vamos, que te simplifica la vida, pero también podrías hacerlo tú a mano.

Espero que te sirva... y que la respuesta no llegue demasiado tarde... :-)