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 señalar direcciones fuera del segmento predeterminado.

La comparación y la aritmética en punteros lejanos son problemáticas: 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 21 bits [Nota 1] . Puede haber hasta 4096 pares de direcciones de segmento-desplazamiento diferentes que apuntan a una dirección física. Para comparar dos punteros lejanos, primero deben convertirse (normalizarse) a su representación lineal.

En los compiladores de C destinados a la familia de procesadores 8086, los punteros lejanos se declaraban utilizando un calificador no estándar; por ejemplo, se definía un puntero lejano a un char . La dificultad de normalizar punteros lejanos se podía evitar 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 del 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
pEntonces , qambos apuntan a la misma ubicación 0x55555.

Notas

  1. ^ Los primeros procesadores x86 solo tenían un bus de direcciones de 20 bits, por lo que los resultados superiores a 1 MiB se reducían a cero, descartando el bit de acarreo. Las PC que usaban el 80286 o posterior, que tenía las líneas de dirección necesarias, implementaron la compuerta A20 para alternar este comportamiento y lograr compatibilidad con versiones anteriores de software.

Referencias

  1. ^ Miller, Ethan L.; Neville-Neil, George; Benetopoulos, Achilles; Mehra, Pankaj; Bittman, Daniel (diciembre de 2023). «Punteros en la memoria lejana». Comunicaciones de la ACM . 66 (12). Ciudad de Nueva York: Association for Computing Machinery . 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 .