viernes, 21 de noviembre de 2008

Tipos de datos y modos de direccionamiento

Los tipos de datos en IA son bytes (8 bits), words (2 bytes o 16 bits), doublewords (4 bytes o 32 bits), y quadwords (8 bytes o 64 bits). Los principales son los tres primeros. El Pentium III introduce otro tipo de datos más largo de 128 bits, compactando números en punto flotante de precisión única (32 bits).
En los tipos word, doubleword, y quadword no es necesario que estén alineados en memoria en límites naturales (los límites para el tipo word son las direcciones pares, para el tipo doubleword son las divisibles por 4, y para el tipo quadword las divisibles por 8). Sin embargo, para mejorar el rendimiento de los programas las estructuras de datos (sobre todo las pilas) tienen que estar alineados a sus límites naturales cuando sea posible. Esto se debe a que si se sobrepasan los límites el procesador lo considera no alineado y requiere dos ciclos de bus de memoria para acceder a los datos (si estuvieran alineados, requeriría uno). Cuando se accede a datos de 128 bits del Pentium III, esos datos tienen que asignarse a límites de 16 bytes. Hay instrucciones que permiten el acceso si no están alineados, pero requiere tiempo extra para recibir los datos en el cache. Si se utiliza una instrucción que espera datos alineados y no lo están, ocurrirá una falta de protección general.
Algunas instrucciones soportan interpretaciones adicionales de estos tipos de datos para permitir operaciones sobre datos numéricos (enteros con o sin signo y enteros BCD).
Los enteros son números binarios con signo que ocupan un byte, un word o un doubleword. Todas las operaciones asumen dos representaciones complementarias. El signo es el bit que está más a la izquierda, y toma el valor 0 cuando el número es positivo o cero, y 1 cuando es negativo. Los rangos son: para un byte entero, de -128 a 127; para un word entero, de -32768 a 32767; y para un doubleword entero, de -2^(31) a 2^(31)-1.
También hay enteros sin signo (o ordinales), todos positivos. Los rangos son: para un byte de ordinales, de 0 a 255; para un word, de 0 a 65535; para un doubleword, de 0 a 2^(32)-1.
Los enteros BCD (Binary-Coded Decimal integers, o enteros decimales codificados en binario) son enteros de 4 bits sin signo con valores entre 0 y 9. Pueden ser no compactados (un dígito BCD por byte) o compactados (dos dígitos BCD por byte). El valor de un BCD no compactado es el valor binario de la mitad más baja del byte (bits del 0 al 3). El valor de la mitad más alta es indiferente, excepto en operaciones de multiplicación y división que deben ser cero. Un BCD compactado son dos números en un byte; en este caso el número de la mitad más alta (del 4 al 7 bit) es el más significativo. Por "compactado" se entiende que por ejemplo, en vez de usar un registro de 64 bits para guardar un dato de 64 bits (un quadword), se puede usar para guardar 2 datos de 32 bits (un doubleword), 4 datos de 16 bits (un word), o 8 datos de 8 bits (un byte). Es un concepto muy importante para la tecnología MMX.
Los punteros son localizaciones de las direcciones en memoria. El procesador reconoce dos tipos; el puntero para direcciones cercanas (32 bits) y el puntero para direcciones lejanas (48 bits). El primero actúa sobre un segmento de la memoria, y el segundo es una dirección lógica de 48 bits que consiste en 16 bits para el selector de segmentos, y de 32 bits para la dirección.
Los campos de bits son secuencias contiguas de bits. Pueden empezar en cualquier bit de cualquier byte de la memoria, y ocupar más de 32 bits.
Las instrucciones de punto flotante reconocen un conjunto de números reales, enteros y enteros BCD que explicaré en otro capítulo más adelante.
Algunas instrucciones usan datos codificados en ella como propios operandos. Estos operandos se llaman operandos inmediatos. Por ejemplo, en esta instrucción -> ADD EAX, 14 añade el operando inmediato 14, al contenido del registro EAX. Excepto DIV y IDIV, todas las operaciones aritméticas permiten el uso de operandos inmediatos.
Los datos también pueden estar contenidos en registros, dependiendo de la instrucción a ejecutar; las operaciones DIV o MUL usan operandos quadword en un par de registros de 32 bits cada uno. No registros cualquiera, porque el procesador tiene unos determinados para controlar la administración de memoria, las interrupciones y excepciones, etc.
Los operandos fuente y destino en memoria son referenciados por el selector de segmento y un offset. El primero especifica el segmento que contiene el operando, y el offset especifica la dirección efectiva del mismo. El selector de segmento puede especificarse implicita o explicitamente. La forma más común es cargarlo en un registro de segmento y permitir al procesador que lo seleccione implícitamente dependiendo del tipo de operación a ejecutar. El procesador automáticamente lo selecciona de acuerdo con unas reglas.La parte offset se puede especificar directamente como un valor estático (llamado desplazamiento) o a través de una dirección computada, creada a partir de uno o más de los siguientes componentes: Desplazamiento (un valor de 8, 16 o 32 bits), Base (un valor en un registro de proposito general), Index (un valor en otro registro de proposito general) y factor de escala (un valor de 2, 4 o 8 que se multiplica al valor de Index). La salida final se llama dirección efectiva.
El procesador soporta un espacio de direcciones de E/S (entrada/salida) que contiene más de 65536 puertos E/S de 8 bits. Estos puertos son de 16 o de 32 bits y serán definidos en el espacio de direcciones de E/S. El direccionamiento a estos puertos lo explicaré más adelante.

No hay comentarios: