Aula Macedonia


Curso de Programación en Ensamblador para PC


Artículo realizado por
Ricardo Amil "Artemis"





Capítulo 2.
Tipos de datos y operaciones binarias.

En el número anterior se explicó el sistema de numeración de un PC. Ahora se podrán ver los diferentes tipos de datos que en éste se usan como unidad de medición:

1 BIT: Es la mínima parte de información existente. Es una cifra binaria (puede ser 1 ó 0). Rango decimal = de 0 a 1.

1 NIBBLE = 4 BITS: Es la base del sistema hexadecimal, ya que: 1111 bin = 15 dec. = F hex. Puede ser representado con 1 dígito hexadecimal. Ej: 0Fh. Rango decimal = de 0 a 15.

1 BYTE = 2 NIBBLES = 8 BITS: Es la base estándar para la representación de datos. Puede ser representado con 2 dígitos hexadecimales. Ej: 0FFh. Rango decimal = de 0 a 255.

1 WORD = 2 BYTES = 4 NIBBLES = 16 BITS: Puede ser representado con 4 dígitos hexadecimales. Ej: 0FFFFh. Rango decimal = de 0 a 65.535.

1 DWORD = 2 WORDS = 4 BYTES = 8 NIBBLES = 32 BITS: Es una palabra doble (DOUBLE-WORD). Puede ser representado por 8 dígitos hexadecimales. Ej: 0FFFFFFFFh. Rango decimal = de 0 a 4.294.967.295.

1 KILOBYTE = 256 DWORDS = 512 WORDS = 1.024 BYTES = 2048 NIBBLES = 8192 BITS: Aunque su nombre despiste, el kb. es un conjunto de 1.024 y no de 1.000 bytes. Puede ser representado por 2.048 dígitos hexadecimales. Ej: JA, JA!!! Rango decimal = de 0 a 28192.

1 MEGABYTE = 1.024 KILOBYTES = 262.144 DWORDS = 524.288 WORDS = 1.048.576 BYTES = 2.097.152 NIBBLES = 8.388.608 BITS: Puede ser representado por 2.097.152 dígitos hexadecimales (esto lo hago para que quede bien claro que cada nibble representa un dígito hexadecimal). Rango decimal = de 0 a 28.388.608 (esto lo hago para que quede bien claro que el número de bits representa al exponente de la base 2)(la base es 2 porque cada bit puede albergar solo dos valores decimales, 1 ó 0).

1 GIGABYTE = 1.024 MEGABYTES = 1.048.576 KILOBYTES = 268.435.456 DWORDS = 536.870.912 WORDS = 1.073.741.824 BYTES = 2.147.483.648 NIBBLES = 8.589.934.592 BITS: ¿Por cuántos dígitos hexadecimales puede ser representado?... Muy bien!!! (2.147.483.648). Rango decimal = de 0 a 28.589.934.592.

1 TERABYTE = 1024 GIGABYTES = 1.048.576 MEGABYTES = 1.073.741.824 KILOBYTES = 274.877.906.944 DWORDS = 549.755.813.888 WORDS = 1.099.511.627.776 BYTES = 2.199.023.255.552 NIBBLES = 8.796.093.022.208 BITS: Puede ser representado por 2.199.023.255.552 dígitos hexadecimales. Rango decimal = de 0 a 28.796.093.022.208.

OPERACIONES BINARIAS: A continuación se explicarán las cuatro operaciones fundamentales de los dígitos binarios. Recordar que 0 = "falso" y 1 = "verdadero".

 

 

 

Operación AND ("Y" lógico): Se toman dos dígitos binarios, y si los dos son verdaderos el resultado también lo es.

 

 

 

 

 

 

Operación OR ("O" lógico): Se toman dos dígitos binarios, y si los al menos uno es verdadero el resultado también lo es:

 

 

 

 

 

 

 

Operación XOR (OR exclusivo): Se toman dos dígitos binarios, y si sólo uno de los dos es verdadero el resultado también lo es:

 

 

 

 

Operación NOT (negación): Se toman sólo un dígito binario y el resultado será el valor opuesto:

 

 

SEGMENTOS Y DESPLAZOS (segments & offsets):

Cuando se diseñó el 8088, los ingenieros pensaron que nunca se usaría más memoria que 1 megabyte. Entonces lo construyeron de manera que no se podía acceder a memorias mayores que 1 MB. Para acceder al MB se necesitan 20 bits, pero el problema es que un registro tenía solo 16 bits y si se usaban dos registros eran 32 bits, demasiado. Entonces decidieron que usarían 2 registros, pero que no conformarían 32 bits, que darían direcciones de 20 bits. Como ya veremos más adelante, cada registro de 16 bits posee dos registros de 8 bits: 1 alto y 1 bajo. Si tenemos 32 bits, tenemos 4 bytes, 2 bytes de cada registro de 16 bits. Pensando que los dos bytes inferiores pueden tener un valor máximo de 0FFFFh (el cero delante se usa para que el ensamblador entienda que no es una cadena sino un número y la h es el símbolo de hexadecimal), 4 nibbles; esto nos da acceso a (0FFFh = 65535d) 65535 bytes de memoria, a esto se le llama bloque. Estos 2 bytes son el "offset" o desplazo.

Ahora tenemos 2 bytes del registro superior o de segmento, que se sitúan en los 16 bits superiores de la dirección de 20 bits, quedando los 4 bits inferiores a 0, o sea que el valor se multiplicó por 16 ya que 10000b = 16d. Ahora se le suma a este valor el offset, y el resultado es la dirección real de 20 bits, de ésta manera se pudieron aprovechar 32 bits de los 2 registros para formar una dirección de 20 bits. Ejemplo:

Recordar que para expresar una dirección de memoria se usa segment:offset. Hay direcciones físicas o reales que pueden ser accedidas con diferentes valores de segment:offset, por ejemplo 0FFF:0001 = 0000:FFF1.

El valor máximo de la dirección real (20 bits) es de 1048575 (1 MB) y aunque los dos registros con su máximo valor dieran por resultado: 65535*16 + 65535 = 1114095 (65520 bytes más que 1MB), solo hay 20 bits y no 21 para acarrear el bit más significante. Para tener este 21er bit se necesita activar algo llamado la línea A20, más conocida como memoria alta (la administra en DOS el "himem.sys"), pero esto no es de importancia.

En el próximo número veremos los registros y su utilidad.

 



ÚLTIMA REVISIÓN EN JULIO DE 1999


[Aula Macedonia]
[Curso de Ensamblador]


AULA MACEDONIA
X
MACEDONIA Magazine