Curso de Asembler - Operaciones con bytes

2 - Operaciones con bytes

[editar]
Curso gratis creado por Pablo Barrón Ballesteros ( Wintermute ).
04 de Noviembre de 2005
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-)
[editar]

7 opiniones

Opinión.

Obsoleto. Poco práctico. Inservible. Para un museo puede estar bien. Jajaja no sería obsoleto si fueras a programar un sistema operativo , es un lenguaje muy poderoso , en el que está hecho parte de windows , y de linux

saludos.
Felicitaciones.

Excelente explicacion gracias.
Bueno.

El curo esta bueno pero necesito tener mas informacion para crear programas.
Mvp.

Excelente.
Bueno.

Excelente trabajo. Siga adelante.
1 2 | siguiente >

Cursos gratis relacionados con 'Curso de Asembler'

Completo curso de lenguaje ensamblador.

Autor y licencia de 'Curso de Asembler'


Curso gratis de Pablo Barrón Ballesteros ( Wintermute ). Extraido de: CopyLeft
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.