Hay cuatro operaciones b sicas que se pueden realizar con un número
binario, y coinciden con operaciones de la lógica matem tica, con lo que
cualquiera que la haya estudiado tendr cierta ventaja para entenderla.
Para explicarlas, llamar‚ al valor 0 resultado "falso", y al valor 1
"verdadero". Las operaciones son AND, OR, XOR y NOT
AND:
Es un 'y' lógico. Se realiza entre dos cifras binarias confrontando cada
cifra con su correspondiente, y el resultado ser "1" si las dos son
verdaderas ( si las dos valen "1" ), y "0" ( falso ) en el resto de los
casos.
AND
1.numero 2.numero Resultado
1 1 1
1
1
Vuelvo a la lógica para explicarlo m s claramente: Imaginemos la frase:
"El hombre es un mamífero y camina erguido". El hecho de que el hombre sea
un mamífero es cierto ( 1 ), y el de que camine erguido, otro ( 1 ). Por
lo tanto, al unirlos mediante una conjunción ( 'y' o 'AND' ), resulta que
ya que se dan las dos, la oración es verdadera.
Pongamos un ejemplo m s complejos, queremos realizar un AND lógico entre
dos bytes:
11011000 AND 01101001
Observemos lo que sucede:
11011000 216
AND 01101001 En sistema decimal sería: AND 105
(aunque en sistema decimal
01001000 es m s lioso) 72
Cuando coinciden dos valores de "verdad", el resultado es "verdad",
si uno es falso, el resultado es "falso" ( no es verdad que "El hombre
es un mamífero y respira debajo del agua" ), y si los dos son falsos, el
resultado es falso ( no es cierto que "El hombre es un ave y respira
debajo del agua" )
OR
El "o" lógico. El resultado es "verdadero" cuando al menos uno de los
factores es verdadero. O sea, es "1" cuando al menos uno de los dos factores
es "1".
Sería como la frase "Voy a buscar el peine o la caja de condones", donde
que uno sea cierto no significa que el otro no lo sea; es cierta la frase,
es verdadera mientras uno de los t‚rminos sean verdaderos.
Operemos con los números "10100110" y "01101100":
10100110
OR 01101100
11101110
Como hemos visto, el valor 1 ( verdadero ) queda en las cifras de las
que, confrontadas, al menos una es verdadera. Sólo resulta 0 ( falso ) si
los dos números enfrentados son 0 ( falsos ).
XOR
"Or" exclusivo. Se trata de una orden parecida al OR, tan sólo que
la verdad de una excluye la de la otra. El resultado, por tanto, es "1"
( verdad ) cuando uno y sólo uno de los dos números es verdadero ( y el
otro falso, claro ). Sería como la oración "O vivo o estoy muerto", para
que sea cierta se tiene que dar una de las dos, pero nunca las dos o
ninguna.
10111001
XOR 01011101
11100100
La orden XOR va a ser bastante útil en encriptación, pero eso ya es otra
historia,...
NOT
Esto se aplica sobre un sólo número, y en t‚rminos de lógica sería la
negación de una oración, o sea, si el número al que se aplica es 1 el
resultado es 0, y viceversa. En t‚rminos de lógica matem tica aplic ndolo
a una oración, sería por ejemplo " No es verdad que tenga ganas de estudiar
y de no beber ", negando las otras dos que en caso contrario serían verdad:
NOT 11100110
00011001
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Bytes, bits y dem s ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Tan sólo, por si alguien no lo conoce, quiero detallar el modo de
almacenamiento del ordenador, incluyendo lo m s temido por el iniciado en
Ensamblador, y m s engorroso para el programador, Segments y Offsets.
La unidad mínima de información es el bit. Su estado, como vimos
anteriormente, puede ser 1 o 0.
Un conjunto de ocho bits, forman un byte. De ellos, el de la derecha
es el menos significativo ( su valor es menor ), y el de m s a la izquierda
el m s significativo.
Un Kbyte es un conjunto de 1024 ( que no 1000 ) bytes. Igualmente, un
MegaByte ser n 1024 kbytes, o 1024*1024=1048576 bytes.
Otro t‚rmino que utilizaremos a menudo, es palabra, o "word". Una
"palabra", es un conjunto de dos bytes, y se utiliza por que a menudo se
opera con ellas en lugar de bytes.
Y ahora, despu‚s de ‚stas cosillas, vamos con lo interesante,...
segments y offsets:
Resulta que hubo un tiempo, cuando los dinosaurios dominaban la tierra,
en el que a "alguien" se le ocurrió que con 640K debería de bastarnos para
hacerlo todo. Y bien, por aquí vienen los problemas ( y voy a intentar
explicarlo lo m s mundanamente posible )
El ancho de bus de direcciones, para localizar un punto en memoria, es
de 20 bits. Por lo tanto, el número m ximo de direcciones de memoria a las
que podremos acceder ser 1 Mb. Pero como veremos, 20 bits no son ni 2 bytes
ni 3, sino así como 2 y medio %-). El problema es ordenarlos para que el
procesador conozca la dirección de memoria, y aquí llegan las cosillas,...
Necesitaremos para conocer una posición de memoria pues cuatro bytes
combinados de una curiosa manera.
Imaginemos los dos bytes inferiores. Su mayor valor puede ser 0FFFFh
( poner un cero delante es una convención, para que lo entiendan los
ensambladores, al igual que la h al final indicando que es un número
hexadecimal ). Esto nos da acceso a 64Kb de memoria, que se considera un
bloque. Tambi‚n, a partir de ahora, llamaremos Offset a la dirección
indicada por ‚stos dos bytes.
Ahora querremos m s memoria que 64 Kb, claro. Y para eso tenemos los
otros dos bytes. Para formar la dirección completa, se toman los 16 bits
del registro de segmento y se situan en los 16 bits superiores de la
dirección de 20 bits, dejando los otros cuatro a cero. Vamos, como si
a¤adi‚semos cuatro ceros a la derecha. Sumamos entonces a ‚ste valor de
20 bits el Offset, resultando la dirección real de memoria
Voy a dar una explicación m s gr fica, porque creo que no me voy a
enterar ni yo:
Sea el valor de Segmento ( parezco un libro de matem ticas, j*der XD )
0Ah ( o sea, 10 decimal o 1010b, binario ). Y el del Offset digamos que
va a valer ( en binario ) 01011111 00001010.
La suma para obtener la dirección de memoria sería tal que así:
0000 0000 0000 1010 0000 ( segmento multiplicado*16, con 4 ceros m s )
+ 0101 1111 0000 1010 ( el offset )
0000 0101 1111 1010 1010
Y ‚sta sería la dirección *real* de memoria ( 05FAAh o 24490 Dec ). Como
podr‚is observar, y como curiosidad final, distintos segments y offsets
especifican direcciones de memoria distintas; por ejemplo, los pares
0040h:0000 ( donde el primero es el Segment y el segundo el Offset, así
lo tomaremos a partir de ahora ), son iguales que 0000:0400h, y los dos
se referirían a la misma posición de memoria física, la 0400h o 1024d
Espero que haya quedado claro, aunque sea símplemente tener una ligera
idea. Lo próximo ser n los registros, y ( y ahora me pongo como los del
Pcmanía cuando hablan de Windoze95 ) podremos empezar en serio con nuestro
lenguaje favorito X-)