[TUTORIAL] ¿Como aprender a programar en ensamblador de manera mas fácil?

  • Hola Invitado ¿Quieres conversar con todos los usuarios de GamerzHacking?, No esperes mas y entra al canal de Discord dando clic AQUI
  • Hola Invitado ¿Tienes una Web y quieres ser partner de GamerzHacking?, No esperes mas y entra al siguiente enlace AQUI
  • Hola Invitado ¿Quieres formar parte del Staff de GamerzHacking?, No esperes mas y entra al siguiente enlace AQUI
  • Hola Invitado ¿Eres programador y quieres pertenercer GamerzHacking?, No esperes mas y entra a postular aqui AQUI
1 dAmerica/Bogota Noviembre dAmerica/Bogota 2015
1.066
178
63
27
Lima
gamerzhacking.com
#1

Antes de iniciar, me gustaría informar que en este post no se va a enseñar literalmente como programar en ensamblador sino que serán algunos consejos para aprender a escribir en lenguaje ensamblador sin problemas.

¿Que es ensamblador?
Ensamblador es básicamente el lenguaje más cercano al lenguaje maquina, utilizado por desarrolladores avanzados para escribir aplicaciones con alto nivel de rendimiento.

¿Como puedo aprender a programar en ensamblador de manera más fácil?
Pues esto es muy simple y la mejor manera de hacerlo es comprender que ensamblador consta de unos cuantos items.
  • Etiquetas
  • Registros
  • Instrucciones

Etiquetas
Las etiquetas son identificadores (nombres, alias, apodos, etc) que se les asigna a una porción de nuestro código (aveces a todo) de tal manera que nosotros podamos (valga la redundancia) identificar nuestro código ensamblador.

Estas etiquetas son muy utilizadas con instrucciones de salto.

Registros
Los registros son secciones internas de almacenamiento, si usted a programado en Cramel puede interpretar los registros como variables de tipo Entero (4 Bytes - x32 | 8 Bytes - x64).

Cualquier lenguaje de programación basado en la sintaxis de los procesadores Intel de 32 bits posee 9 registros.

  • EAX (Acumulador) - Utilizado para retornar valores de procedimientos y almacenar valores que sera procesados por cálculos aritméticos.
  • EBX (Base) - Utilizado como apoyo para realizar cálculos, algunas instrucciones no dejan procesar valores directamente, se asigna el valor a ebx y se utiliza junto a la instrucción.
  • ECX (Contador) - Contador para bucles y registro de apoyo para cálculos o procesos lógicos (como la rotación de bits).
  • EDX (Data)- Utilizado mayormente para pasar parámetros a procedimientos con método de llamada como FASTCALL.
  • ESI (Source Index) - Utilizado generalmente como puntero para escribir en memoria.
  • EDI (Destination Index) - Utilizado generalmente como puntero para escribir en memoria.
  • EBP (Base Pointer) - Este registro generalmente apunta a la base de la pila y es utilizado por los procedimientos para apuntar a una nueva sección de la pila.
  • ESP (Stack Pointer) - Utilizado para almacenar la base previa de la pila y como referencia de escritura de la pila.
  • EIP (Instruction Pointer) - Almacena la dirección de la instrucción actualmente siendo procesada.
Usted puede utilizar estos registros para su propósito original o preservarlos en la pila para usarlos como desee.

Instrucciones
A diferencia de las instrucciones de lenguajes de alto nivel, las instrucciones de ensamblador solo realizan su única tarea asignada, por ejemplo, si quisiéramos declarar una sentencia "If/Si" tendríamos que primero escribir la instrucción para comparar y después la instrucción para saltar "en caso de".

Para su mejor memorización se pueden buscar por internet la descripción extendidas de los mnemónicos, por ejemplo:
  • jmp - Jump
  • jne - Jump Not Equal
  • jae - Jump Above Equal
  • jbe - Jump Below Equal
  • jb - Jump Below
  • ja - Jump Above
  • je - Jump Equal
  • jz - Jump Zero
  • js - Jump Sign
  • shl - Shift Left
  • shr - Shift Right
  • mov - Move
  • xchg - Change
  • movzx - Move Zero Extended

[Ultimo] Optimización
Las instrucciones ensamblador son representadas por el compilador a sus correspondientes opcodes, pero hay maneras de minimizar y por lo tanto aumentar la velocidad de ejecución de nuestro código ensamblador.

Supongamos que queremos limpiar el registro EAX, estableciéndolo a cero, la manera mas común seria hacer lo siguiente:

Código: ASM
  1. mov eax,0 ; B8 00 00 00 00 | 6 Bytes.

Pero la manera más optima de realizar esta misma tarea es utilizando XOR.

Código: ASM
  1. xor eax,eax ; 33 C0 | 2 Bytes.

O si quisieramos realizar una comparación en un registro, lo mas normal es:

Código: ASM
  1. cmp eax,1 ; 83 F8 01 | 3 Bytes.

Aunque más eficiente es:

Código: ASM
  1. test eax,eax ; 85 C0 | 2 Bytes.
Saludos,
 
Me gusta: torresbarrag