Bienvenidos a mi primer tutorial sobre ensamblador. Me presento soy Mr Burns un newbie en esto del cracking que ha decidido hacer otro tutorial más sobre uno de los primeros lenguajes de programacion, el cual es basico para el comienzo del cracking. Cuando yo empeze en esta movida de crackear tuve suerte de llevar ya casi 2 años con Asm (asi es como llamaremos de ahora en adelante al Ensamblador) por lo que no me resulto muy dificil comenzar :-)
Antes de nada
pido perdon por mis faltas ortograficas sucesivas ;-)
Como este tema es
demasiado amplio he decidido ir haciendo esta guia por partes ó
fasciculos, como querais decirlo. Es este apartado empezaremos con
algo básico, aunque un poco aburrido al mi parecer:
1. Conversión
decimal a binaria (y viceversa :-))
2. Conversión decimal a hexadecimal (y viceversa)
3. Estructura de la memoria
4. Registros internos
Bueno....
pues.... empecemos!!
1. Conversión decimal a binaria (y viceversa)
Nuestro sistema de numeracion habitual es el sistema decimal, que es de base 10, es decir, existen 10 digitos (0123456789). Por ejemplo, 1234 en base 10 es igual a 1 X 103 + 2 X 102 + 3 X 101 + 4 X 100 = 1000 + 200 + 30 + 4 = 1234
Para poder diferenciar este sistema de cualquier otro se coloca la letra d al final del numero.
El ordenador esta diseñado para que su sistema numerico sea el binario, lo que kiere decir que existen tan solo 2 digitos (0 y 1). Por ejemplo, 1010 en base 10 es igual a 1 X 23 + 0 X 22 + 1 X 21 + 0 X 20 = 8 + 0 + 2 + 0 = 10 (decimal!)
Para poder diferenciar este sistema de cualquier otro se coloca la letra b al final del numero.
Bueno... para pasar un número binario a decimal hay que realizar los siguientes pasos:
Tenemos el numero "10110"
Le damos la vuelta (mi metodo) --> "01101"
Le multiplicamos a cada numero por 2x, siendo X= 0,1,2,3,4,5,6,7,8,9... y les sumamos
Haciendo esto quedaria: 0 X 20 + 1 X 21 + 1 X 22 + 0 X 23 + 1 X 24 = 0 + 2 + 4 + 0 + 16 = 22
Muchos os preguntareis porqué he dado la vuelta al numero¿?¿? Bueno pues la respusta es que hay que multiplicar al numero por 2x empezando por la derecha... esto implica que tenga que contar las cifras que hay (en este caso 5) y restarlas 1 (ya que empezamos por 0) X-) y la verdad todo esto es un rollo ;-)
Y... ¿para pasar uno decimal a binario? (akilo teneis!!!)
Tenemos el numero decimal "1357"
Le dividimos entre 2 --> 1357 / 2 =678 (1) (este 1 es el resto de la cuenta!!)
Ahora dividimos 678 entr 2 --> 678 / 2 = 339 (0) <-- el resto
Y otra vez... --> 339 / 2 = 169 (1)
Y otra... --> 169 / 2 = 84 (1)
YY otraaa.. --> 84 / 2 = 42 (0)
Así hasta que no se pueda mas...
Los observadores os habreis dado cuenta de que los restos de las cuentas son siempre 0 y 1.... Pues si... es lo que tu crees!!! Esos restos son tu numero binario!!!
Despues de todas esas operaciones juntamos los restos y obtenemos: 10110010101 Pero... este nos es verdadero :-( Lo que hay que hacer es darlo la vuelta :-) para que nos quede bien!! Es decir, 10101001101.
Despues de esto espero que sepais hacer DECIMAL-->BINARIO-->DECIMAL
2. Conversión decimal a hexadecimal (y viceversa)
En este apartado aprenderemos a tratar con cifras de base 10 y base 16.
El sistema de numeración hexadecimal consta de 16 cifras: 10 números (0123456789) y 6 letras (ABCDEF). Cada una de estas letras tiene un valor: A=10, B=11, C=12, D=13, E=14, F=15. Un numero hexadecimal corriente podria estar representado asi: 17BC5A (1555546).
Para poder diferenciar este sistema de cualquier otro se coloca la letra h al final del numero.
Vamos a pasar un
número decimal a hexadecimal:
Tenemos el número decimal "1234"
Dividimos esta cifra entre 16 dejando el resto (como hicimos la otra vez)--> 1234 / 16 = 77 (2)
Otra vez... --> 77 / 16 = 4 (13)
Como siempre hemos de coger los restos y el último resultado, pero al revés: 4-13-2
Com hemos visto antes en el sistema hexadecimal el 13 no existe, sino que es sustituido por la D, asi... que lo sustituimos!
Y como resultado final nos queda que 1234d = 4D2h
Y ahora pasaremos un número hexadecimal a decimal:
Tenemos el número hexadecimal "29A" ;-)
Como la otra vez, damos la vuelta al número --> A92
Multipicamos a cada cifra por 16X, siendo X=0,1,2,3,4,5,6,7... --> A X 160 + 9 X 161 + 2 X 162 = A X 1 + 9 X 16 + 2 X 256
Como hemos dicho antes A=10, asi que nos quedaría: 10 + 144 + 512 = 666 }:-)
Como habeis podido comprobar los cambios de base de numeración son súmamente sencillos. Y la verdad lo son mucho más si utilizas la calculadora que nos proporciona el güindous en modo científico. Te aconsejo que trabajes un poco con ella y te acostumbres a usarla ;-)
3. Estructura de la memoria
BIT
Es la unidad de memoria más pequeña conla que trabaja nuestro ordenador. Se basa en el sistema binario ya que posee dos estados posibles (0 y 1). La palabra BIT es la abreviación de Binary Digit (Dígito Binario).
BYTE
Es la agrupación de 8 Bits. el Byte es la unidad de direccionamiento, es decir, podemos referirnos a cada Byte mediante un número, que es su dirección. Los bytes se numeran empezando por el cero: 0,1,2,3,4...
Como bien sabemos todos hay diferentes agrupaciones de Bytes: KiloBytes (Kb), MegaBytes (Mb), GigaBytes (Gb), TeraByte (Tb)
Un cosa curiosa de los Bits de un Byte es que se numeran de derecha a izquierda:
0 1 1 1 1 1 0 0 <-- Número
7 6 5 4 3 2 1 0 <-- Bits
NIBBLE
Es una unidad un tanto extraña y se compone por la unión de 4 Bits, lo que quiere decir que es medio byte. Dentro de un Byte los Bits de 0 a 3 corresponden con el Nibble inferior y los Bits 4 a 7 con el Nibble superior.
PALABRA
Consiste en la unión de 2 Bytes contiguos
DOBLE
PALABRA
Consiste en la unión de 2 Palabras contiguas (8 Bytes)
CUADRUPLE
PALABRA
Consiste en la unión de 4 Palabras contiguas (8 Bytes)
PARRAFO
Consiste en la unión de 16 Bytes
PAGINA
Consiste en la unión de 256 Bytes
SEGMENTO
Consiste en la unión de 64 KiloBytes
4. Registros internos
Los registros internos son 14, cuyos Bits se numeran de derecha a izquierda, siendo 0 el Bit menos significativo.
Registros
de Datos
AX = Acumulador.
Registro principalutilizado en la instruccuiones aritméticas
BX = Base. Se usa para indicar un desplazamiento (Offset)
CX = Contador. Se utiliza como contador en los bucles y en operaciones repetitivas
DX = Dato. Se usa también en operaciones aritméticas
Registros
de Segmentos
CS = Registro de
segmento de código (Code Segment). Contiene la dirección
del segmento de código
DS = Registro de segmento de datos (Data Segment). Contiene la dirección del segmento de datos
SS = Registro de segmento de pila (Stak Segment). Contiene la dirección del segmento de pila
ES = Registro de segmento extra (Extra Segment). Contiene la dirección del segmento extra
Registros
Punteros de la Pila
SP = Puntero de la pila (Stak Pointer) Contiene la dirección relativa al segmento de la pila
BP = Puntero base (Base Pointer) Se usa para fijar el puntero de la pila
Registro
de Instrucción
IP = Puntero de Instrucción (Instructuion Pointer). También llamado contador de programa. Contiene el desplazamiento de la instrucción siguiente a ejecutar respecto al segmento de código del programa en ejecución. Unido a CS (CS:IP) indica la dirección completa de la siguiente instrucción a ejecutar.
Registro
de Banderas
(de
estado)
CF = Bandera de Acarreo (Carry Flag) Indica el acarreo en intrucciones aritméticas
OF = Bandera de desbordamiento (Overflow Flag)
ZF = Bandera de resultado cero o comparación igual (Zero Flag)
SF = Bandera de resultado o comparación negativa (Sign Falg)
PF = Bandera de paridad (Parity Falg)
AF = Bandera auziliar (Auxiliar Falg)
Registro
de Banderas (de control)
DF = Bandera de dirección (Direction Flag)
IF = Bandera de interrupciones (Interrupt Flag)
TF = Bandera de atrape (Trap Flag) Controla la operación modo paso a paso
Bueno este es el
final del primer tutorial sobre ensamblador. Espero que os halla
servido de ayuda para comenzar. Estudiadlo bien porque dentro de poco
(con suerte :-)) estoy aqui de nuevo con más y mejor ;-)