stringtranslate.com

puntero lejano

En una computadora con arquitectura segmentada , un puntero lejano es un puntero a la memoria en un contexto específico, [1] como un selector de segmento que permite apuntar a direcciones fuera del segmento predeterminado.

La comparación y la aritmética en punteros lejanos es problemática: puede haber varios pares de direcciones de desplazamiento de segmento diferentes que apunten a una dirección física .

En x86 de 16 bits

Por ejemplo, en un Intel 8086 , así como en procesadores posteriores que ejecutan código de 16 bits , un puntero lejano tiene dos partes: un valor de segmento de 16 bits y un valor de desplazamiento de 16 bits . Una dirección lineal se obtiene desplazando el valor del segmento binario cuatro veces hacia la izquierda y luego sumando el valor de desplazamiento. Por lo tanto, la dirección efectiva es de 20 bits (en realidad, de 21 bits, [ ¿cuáles? ] , lo que llevó a la dirección envolvente y a la Puerta A20 ). [ se necesita aclaración ] Puede haber hasta 4096 pares de direcciones de desplazamiento de segmento diferentes que apunten a una dirección física. Para comparar dos punteros lejanos, primero se deben convertir (normalizar) a su representación lineal de 20 bits.

En los compiladores de C destinados a la familia de procesadores 8086, los punteros lejanos se declararon utilizando un calificador no estándar ; por ejemplo, definió un puntero lejano a un carácter . La dificultad de normalizar los punteros lejanos podría evitarse con el calificador no estándar . En otros compiladores se hizo utilizando un calificador igualmente no estándar. [2]farchar far *p;huge__far

Ejemplo de puntero lejano:

#include <stdio.h> int main () { char lejos * p = ( char lejos * ) 0x55550005 ; char lejos * q = ( char lejos * ) 0x53332225 ; * p = 80 ; ( * p ) ++ ; printf ( "%d" , * q ); devolver 0 ; }                      
Salida del siguiente programa: 81; Porque ambas direcciones apuntan a la misma ubicación.
Dirección física = (valor del registro de segmento) * 0x10 + (valor del desplazamiento).
La ubicación a la que apunta el puntero pes: 0x5555 * 0x10 + 0x0005 = 0x55555
La ubicación a la que apunta el puntero qes: 0x5333 * 0x10 + 0x2225 = 0x55555
Entonces, pambos qapuntan a la misma ubicación 0x55555.

Referencias

  1. ^ Molinero, Ethan L.; Neville-Neil, George; Benetopoulos, Aquiles; Mehra, Pankaj; Bittman, Daniel (diciembre de 2023). "Punteros en la memoria lejana". Comunicaciones de la ACM . 66 (12). Ciudad de Nueva York: Asociación de Maquinaria de Computación . ISSN  0001-0782. LCCN  61065941. OCLC  1514517. Wikidata  Q1120519 . Consultado el 11 de febrero de 2024 .
  2. ^ "Introducción a Open Watcom C/C++". GitHub . 2024 . Consultado el 11 de febrero de 2024 .