Apuntes de ACP. Tema 1. El sistema PC: Estructura Lógica. Modelo de capas del sistema (AplicaciónDosBIOSHW) Conjunto de registros del PC: De propósito General AX AH AL BX BH BL CX CH CL DX DH DL Registros de segmento CS Code Segment DS Data Segment ES Extra Data Segment SS Stack Segment ( pila ) Registros de Indice SI Indice de Segmento DI Indice de Datos SP Stack Pointer BP Base Pointer IP Contador de Programa (Instruction Pointer) Los registros de propósito general son accesible por byte (8 bits) y por palabra (16 bits), todos los demas registros son solo accesibles por palabra, pero todos ellos tienen 16 bits. Al manejar memoria segmentada cada aplicación se divide en tres (cuatro) segmentos: codigo (instrucciones), datos (1 o 2 segmentos) y la pila. Estos segmentos se hallan apuntados por los registros de segmento. Faltan cosas, muchas cosas Segmentación : Espacio Lógico. Una posición dentro de un segmento se alcanza con dos palabras de 2 bytes cada una: Segmento Indica la posición de la base del segmento. Offset Indica el desplazamiento a partir de dicha base. Los segmentos pueden tener un tamaño máximo de 64KBytes, ya que son direccionados por un offset de 16 bits (2 bytes), esto da lugar a que la memoria de 1MB pueda ser direccionada con solo 16 segmentos ( 0 F ) pero esto puede dar lugar a que hayan solapamientos, ya que no tienen por que medir todos los segmentos 64 KB. La situación puede ser la siguiente: Focopiar pag. 11. Para evitar esto el DOS realiza una Normalización de las direcciones y establece que cada segmento es de 16 KB y que pueden haber hasta 64 KB segmentos distintos sin solapamiento. Sin Normalizar Segmento 0000 FFFF Offset 000 FFF Con solapamiento Normalizados Segmento 0000 FFFF Offset 0F Sin solapamiento Dir. Lógica = [ Segmento : Offset ] 16 bits 16 bits Dir. Física = Segmento * 16 + Offset Poner dibujitos Programación de los punteros en Turbo Pascal: Type Puntero = record offset : word; segmento : word; end; Var Ptr_word : ^word; Ptr_aux : Puntero; Carga de un puntero con valores: Ptr_aux.offset:=valor_offset; Ptr_aux.segmento:=valor_segmento; Ptr_word:=pointer(Ptr_aux); Ptr_word:=Ptr(valor_segmento, valor_offset); Solo en Turbo Pascal Hay dos instrucciones muy especiales en TP : seg y ofs seg (ptr_word) devuelve la dir. donde esta el segmento ofs (ptr_word) y el offset seg (ptr_word^) ofs (ptr_word^) devuelve el valor del campo segmento y el valor del campo offset