Black Hole organizacion
CostaRica  
  Bienvenida
  Hackers
  Foro ingresa
  Noticias
  Contacto
  Imagenes
  Programas
  Visitantes
  Chat
  Libros
  => hacker
  => Virus
  => Cracker
  => Lecciones hackin
  => Programacion
  => Diseños web
  => Guia de hackin
  => Privasidad
  => Guia → 1
  => Guia → 2
  => Guia → 3
  => Guia → 4
  => Guia → 5
  => Guia → 6
  => Guia → 7
  => Guia → 8
  => Guia → 9
  => Guia → 10
  => Guia → 11
  => Como intrudusirse aun sistema
  => shellcodes_linux-1
  => shellcodes_linux -2
  => UN-scodes.
  => Guia version Deluxe
  => Ser Hacker dentro de Términos Legales
  => Como hackear una paginaweb
  => Comoprogramar un Virus
  => Como Crear un Virus
  => Cuantos tipos de Virus existen
  => Programaciones de un virus
  => Estructura de computadores
  => Fundamentos de SSOO
  => Sistemas de numeración
  => Ensamblador I: Conceptos básicos
  => Ensamblador II
  => Utilidades para la programación
  => Infección bajo Windows
  => Infección bajo Linux
  => Técnicas avanzadas
  => Apéndices
  => CONOCIENDO LA MAQUINA
  => DIRECCIONAMIENTO DE MEMORIA EN EL 8086
  => CHIPS DE APOYO (Ampliación de la lección 1)
  => LA PILA DEL 8086
  => CODIFICACIÓN DE LAS INSTRUCCIONES EN EL 8086
  => Manual HTML
  => Ataques basados en Desbordamiento de Buffer (Buffer Overflow)
  => Privasidad
  => Escaneo
  => anti Escaneo y Escaneo
  => Malianom
  Triang
  Tersirve esta paguina?
  -
  juegos
  Vagos
  mapa
  Mapa del sitio
  546
Sistemas de numeración

Atras


El sistema decimal no tiene porqué ser el mejor; es sencillamente al que estamos acostumbrados. Para programar en ensamblador habrá que trabar amistad con otros dos sistemas, o al menos conocerlos algo por encima. Esos sistemas, son el binario y el hexadecimal.

 

3.1.- Sistema binario

Mientras que el sistema decimal utiliza diez cifras, los números del 0 al 9, para representar la información, el sistema binario sólo va a tener dos cifras; así, los únicos signos con los que escribiremos en binario serán el 0 y el 1. Así, un número perféctamente válido en binario sería el "100110".

Ahora, ¿cómo traducimos de binario a decimal y a la inversa? Un número como 100110 es muy bonito pero nos expresa más bien pocas cosas. Sí, podemos decir que si a cada una de estas cifras le pusiéramos una etiqueta, el 0 podría significar falso y el 1 verdadero; esta es una de las grandes utilidades del sistema binario, cada cifra puede servirnos para almacenar información en el sentido de si algo es cierto o no.

Pero pasemos a traducirlo, y primero para ello vamos a ver el sentido de la numeración decimal. Pongamos el número 3741 y preguntémonos cómo hemos obtenido su valor; está claro, 3741 es lo mismo que 3x1000 + 7x100 + 4x10 + 1x1. Cada vez que nos desplazamos en una posición a la izquierda, se añade un cero a la derecha del uno inicial que no afecta en su valor a la última cifra (igualmente, 752 sería 7x100 + 5x10 + 2x1).

Ahora veamos el binario; como tiene dos cifras en lugar de las diez del decimal, es de suponer que el primer dígito, el más a la derecha, valdrá su valor multiplicado por 1 (2 elevado a cero, tal y como en el decimal era 10 elevado a cero). El siguiente dígito será 2 elevado a uno, es decir, 2. Y así irán valiendo 2, 2x2, 2x2x2, etc. Más sencillo, con algunos ejemplos:

1011: Su valor será de 1x8 + 0x4 + 1x2 + 1x1 = 8+2+1 = 11 decimal.

1100: 1x8 + 1x4 + 0x2 + 0x1 = 8 + 4 = 12 decimal.

11010111: 1x128 + 1x64 + 0x32 + 1x16 + 0x8 + 1x4 + 1x2 + 1x1 = 128 + 64 + 16 + 4 + 2 + 1 = 215 decimal.

Como es sencillo observar, mientras que el número más a la derecha (o bit menos significativo si lo empezamos a aplicar a la informática) vale 1, cada vez que nos desplazamos a la izquierda el valor de esa cifra es el doble del anterior; así, el segundo bit menos significativo valdrá 2 si la cifra es "1", el siguiente 4, y así 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536...

 

 

 

3.2.- Sistema hexadecimal

Acabamos de ver un sistema numérico con muchos menos símbolos de lo habitual (¡ tan sólo el 0 y el 1 !). Ahora toca hacer al contrario; el sistema hexadecimal tiene nada menos que 16 símbolos. Estos, se representarán mediante los números del 0 al 9, y las letras de la A a la F. Así, el 10 decimal será la A hexadecimal, y el F hexadecimal un 15.

El sistema para traducir de hexadecimal a decimal será del mismo estilo que lo que hacíamos antes; la cifra más a la derecha del número será multiplicada por 16 elevado a 0 (o sea, por uno), la siguiente por 16, la siguiente por 16x16, etc. Nada, no obstante, como una buena calculadora:

E07F: Equivaldrá a 14x4096 + 0x256 + 7x16 + 15 = 57344 + 112 + 15 = 57471 decimal.

Una curiosa coincidencia entre los sistemas hexadecimal y binario, y que hace fácil la traducción entre ambos, es que cada dos cifras hexadecimales corresponden exáctamente a un byte (ocho bits) de información binaria, haciendo la traducción entre ambos sistemas casi automática. Hagamos una pequeña tabla:

Binario Hexadecimal
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F

Con esto en cuenta (alguno se habrá dado cuenta de cómo avanzan los números en binario viendo esta tabla), se puede hacer una traducción casi automática entre ambos sistemas. En el ejemplo anterior:

E07F -> 1110 0000 0111 1111

Por ello vamos a usar bastante estos sistemas, y de hecho el hexadecimal se va a utilizar habitualmente al hacer referencia a posiciones de memoria o valores; por ejemplo un registro de 32 bits se puede representar con un dígito hexadecimal de 8 cifras. La clave reside en que sabemos que ningún número de 8 cifras hexadecimales ocupa más de 32 bits, lo cual hace muy compacto este método de representación.

A continuación, algún otro ejemplo de traducción:

0ABCDh -> 1010101111001101b (usaremos a menudo una h o una b al final del número para destacar que son números hexadecimales o binarios; es bueno acostumbrarse a esta forma de representarlos o en caso del hexadecimal también a 0xABCD, puesto que son las formas más comunes en que un ensamblador que usemos para programar va a identificar que nos estamos refiriendo a valores en estos sistemas de numeración).

1101111010101101b -> 0DEADh

0001001100110111b -> 01337h

 

 

3.3.- Signo/Magnitud

Con los números binarios tenemos un problema: no sabemos representar números negativos. Así pues, se han ideado una serie de sistemas que pretenden solucionar este problema, el más sencillo de los cuales es el signo/magnitud.

En este sistema, la primera cifra del número hará de signo -. Entonces, un byte nos permitirá, haciendo el bit más significativo (el que está más a la izquierda) el signo negativo o positivo, tendremos un rango que irá de -127 a 127 (sin signo iría de 0 a 255), teniendo dos representaciones para el 0 (00000000 y 100000000). Tomaremos entonces, como signo - el 1. Así, será tan sencillo como en los siguientes ejemplos:

01101010b -> 106 decimal

10000010b -> -2 decimal

00000010b -> 2 decimal

10000111b -> -7 decimal

100000000b, 0000000b -> 0 decimal

El problema de esta representación, reside en que no se pueden realizar restas con facilidad; no voy a pararme a explicar cómo se resta en binario - se deduce de todas formas fácilmente de la resta decimal -, pero simplemente decir que no se realiza de forma coherente con este sistema.

 

 

3.4.- Complemento a 1

Un sistema mejorado para la representación de números negativos (aunque ya veremos como todo esto va haciendo más compleja su interpretación) es el complemento a 1. En ella lo que se hace básicamente es, para representar el negativo de un número, el -X, invertir absolutamente todos los bits que lo forman (excepto el primero, que como en Signo/Magnitud será 1 para el negativo y 0 para el positivo).

Ejemplos de esta representación:

01101010b -> 106 decimal

11111110b -> -1 decimal (si comparamos con el signo/magnitud, este sería 10000001, es decir, que lo que hemos hecho es darle la vuelta a las 7 últimas cifras del número).

11111000b -> -7 decimal

 

 

3.5.- Complemento a 2

El algoritmo de representación binaria de complemento a 2, consiste en una mejora del complemento a 1. Se representará el negativo de un número, ese -X, invirtiendo todos los bits que lo forman excepto el primero que marca signo, y en caso de hacerlo de positivo a negativo, sumándole 1 (restando 1 en otro caso). El porqué de esta representación es sencillo y tiene que ver con los motivos que nos llevan a rechazar los dos anteriores como menos válidos; este es el único sistema en el que si se suman un número y su opuesto se obtiene 0, lo cual le da gran consistencia aritmética.

En el caso de complemento a 1, si sumásemos 11111110b (-1) y 00000001b (1), el resultado es 11111111b y no 00000000b (podríamos considerar todo 1s como otra forma del 0, pero tener dos representaciones del 0 sigue siendo aritméticamente un problema). Sin embargo, en complemento a 2, si sumamos 11111111b (-1) y 00000001b (1), el resultado es 00000000b, lo que buscábamos.

Algunos ejemplos de representación:

11111101b -> -3 decimal

11111110b -> -2 decimal

00000011b -> 3 decimal

01111111b -> 127 decimal

 

 

3.6.- Representación práctica

Este último punto, tan sólo pretende destacar las formas en las que se suelen representar los números hexadecimales y binarios; alguna de estas notaciones la he utilizado ya más atrás, pero no está mal recapitular y dejar las cosas claras:

- Notación binaria (común): Los números binarios incluídos dentro de código ensamblador se representan con una "b" al final del bloque de 0's y 1's.

- Notación hexadecimal (común): La más común, sólo tiene dos reglas: la primera, que ha de añadirse una "h" al final del número para distinguir que es hexadecimal. En segundo lugar, si la primera cifra es una letra (por ejemplo, ABCDh), se ha de incluir un 0 al principio (lo cual indica que se trata de un valor numérico al compilador; la forma correcta pues sería escribir 0ABCDh).

- Notación hexadecimal (alternativa): Es la que nos encontramos en el formato AT&T (programas como el GNU Assembler, los desensamblados de GDB, etc), por lo que la veremos menos (NASM, el ensamblador para Linux, permite esta notación y la común de Intel). En esta notación no se escribe una h al final del número sino que simplemente se hace que empiece por "0x". Así, el 0ABCDh del anterior formato se escribiría como 0xABCD, a secas.

Black Hole  
   
Facebook botón-like  
 
 
Hoy hay 10 visitantes¡Aqui en esta página!
Este sitio web fue creado de forma gratuita con PaginaWebGratis.es. ¿Quieres también tu sitio web propio?
Registrarse gratis