Curso Ensamblador x86
Parte 0
INTRODUCCION
Porque ?
-
Es una materia de la universidad.
-
Permite crear programas mas optimizados.
-
Permite comprender mejor el funcionamiento de la computadora.
Donde ?
-
Creacion de sistemas operativos.
-
Creacion de herramientas para sistemas embebidos (IoT).
-
Creacion de drivers.
-
Creacion de compiladores.
-
Examinar y/o modificar programas ya creados (reversing).
Curso Ensamblador x86
Parte 1
Componentes
Componentes de una computadora
-
CPU
-
ALU
-
Unidad de control
-
Registros
-
-
Entrada/salida
-
Memoria principal

CPU
CISC
RISK
Grupo complejo de instrucciones para computadoras
Grupo reducido de instrucciones para computadoras
multiplica a,b
Cargar a
Cargar b
multiplica a,b
Guardar a
Unidad de control

Registros
Entrada/Salida
-
Bus de control
-
Bus de datos
-
Bus de direcciones
MEMORIA

SRAM
MEMORIA

DRAM

Curso Ensamblador x86
Parte II
Arquitecturas
La forma en que los componentes de una computadora se interconectan entre si.
-
Hardvard
-
Von Neuman
-
Hardvard Modificada

Hardvard

Von Neumann

Hardvard Modificada
Hardvard | Von Neumann | |
---|---|---|
x86 (CISC) | INTEL/AMD | |
avr (RISC) | ATmega328P (Arduino) |
|
pic (RISC) | PIC16F84A | |
arm (RISC) | QUALCOMM | |
e.t.c. |


Ensamblador para procesador x86
Curso Ensamblador x86
Parte III
Registros
Registros
Diferentes tipos, segun los propositos para los que se utilicen.
- Registros de proposito general
- Registro de banderas
- Registros de segmentos
Registros de proposito general
Son utilizados para almacenar los datos con los que se realizaran las operaciones dentro del programa

Registro de banderas
Este unico registro almacena el estado del procesador.
Registros de segmentos
Estos registros almacenan las direcciones de memoria donde comienzan y terminan los distintos segmentos o partes en las que el sistema operativo la divide.

Registros adicionales
Estos registros permiter realizar calculos en paralelo y de punto flotante. Forman parte del juego de instrucciones extendidas x86.


Curso Ensamblador x86
Parte IV
Ciclo de Fetch
Fases
Segun el autor que consultemos las fases pueden variar, pero por simplicidad diremos que son dos.
-
Fase de busqueda
-
busqueda de la instruccion en la memoria
-
-
Fase de ejecucion
-
decodificacion de la instruccion
-
ejecucion de la instruccion
-
almacenamiento de los resultados
-

Instruccion:
mul ax, 3

Curso Ensamblador x86
Parte V
Modos de direccionamiento
Diferentes formas de determinar la manera de acceder a los involucrados en una operacion.
Ubicar los datos.
Direccionamiento inmediato.

Direccionamiento por registro.

Direccionamiento directo.

Direccionamiento indirecto a registro.

Direccionamiento relativo a la base.

Direccionamiento indexado.

Direccionamiento indexado a la base.

Curso Ensamblador x86
Parte VI
Interrupciones
Debido a que los perifericos y el procesador de una computadora trabajan a un velocidad diferente.
La interconexion de los elementos de una computadora con la CPU se debe de gestionar.
Interrupciones de hardware
Son generadas por señales electricas de los perificos. Existe un elemento de hardware dedicado a procesar las interrupciones generadas por dispositivos como el teclado, ratos, e.t.c. Las clasifica en "puertos" y administra el momentro en el que son atendidas por la CPU.
Interrupciones de software
Son invocadas desde un programa en esamblador mediante la palabra resevada INT. Existen dos tipos: las creadas por el sistema operativo y las creadas por el BIOS.
Las interrupciones del sistema operativo son las mas sencillas de utilizar pero a la vez tambien son mas lentas por utilizan las del BIOS.
INT 80h Linux
INT 21h MS-DOS
INT 10h - 33h BIOS

Proceso de ejecucion de las interrupciones
Ensamblador para procesador x86 en Linux
Curso Ensamblador x86
Parte VII
Ensambladores y sintaxis
Ensamblador no solo es el nombre del lenguaje de programacion.
Tambien es el nombre del programa que traduce el codigo escrito en Ensablador a algo llamado codigo objeto
Su principal variacion reside en la estructura del programa y en las palabras reservadas.
-
MASM (Microsoft Macro Assembler)
-
TASM (Turbo assembler)
-
GAS (GNU Assembler)
-
NASM (Netwide Assembler)
- E.T.C
Ensamblador para procesador x86 en Linux con NASM
Existen ademas dos formas de escribir las instrucciones en ensamblador.
-
Sintaxis AT&T
-
addl $4, %eax
-
-
Sintaxis Intel
-
add eax, 4
-
Ensamblador para procesador x86 en Linux con NASM con sintaxis Intel
Curso Ensamblador x86
Parte VIII
Instalacion
-
Ubuntu
-
sudo apt-get install nasm build-essential
-
-
Arch
-
sudo pacman -S nasm
-
-
Fedora y Opensuse
-
se be primero agregar el repositorio al gestor de paquetes para poder instalar
-
Curso Ensamblador x86
Parte IX
Generacion de codigo maquina


El codigo objeto almacena el codigo maquina de un programa en ensamblador. Los formatos pueden ser coff, elf, obj, win32, e.t.c.

El proceso de enlazamiento combina el codigo maquina con instrucciones y directivas para que sistema operativo sea capaz de interpretar correctamente el archivo ejecuble.

El enlazador por defecto de los sistemas operativos MAC OS X y GNU/Linux es LD
Para crear un ejecutable con NASM en el sistema operativo GNU/LInux se emplea un par de instrucciones.
nasm -f elf archivo.asm
se empleara el formato elf por que es el formato mas popular compatible con el kernel Linux.
ld -m elf_i386 -o nombre_ejecutable archivo.o
porque crearemos ejecutables de 32 bits, a partir de un archivo en formato elf.
Curso Ensamblador x86
Parte X
Hola Mundo
Curso Ensamblador x86
Parte XI
Suma y resta
Curso Ensamblador x86
Parte XII
Multiplicacion y division
Curso Ensamblador x86
Parte XIII
Instrucciones de desplazamiento
Curso Ensamblador x86
Parte XIV
Instrucciones de rotacion
Curso Ensamblador x86
Parte XV
Instrucciones de comparacion
Curso Ensamblador x86
Parte XVI
Saltos
Curso Ensamblador x86
Parte XVII
Instrucciones booleanas I
Curso Ensamblador x86
Parte XVIII
Instrucciones booleanas II
Curso Ensamblador x86
Parte XIX
Estructuras de decision I
Curso Ensamblador x86
Parte XX
Estructuras de decision II
Curso Ensamblador x86
Parte XXI
Estructuras de control I
Curso Ensamblador x86
Parte XXII
Estructuras de control II
Curso Ensamblador x86
Parte XXIII
Macros y procedimientos
Curso Ensamblador x86
Parte XXIV
Arreglos I
Curso Ensamblador x86
Parte XXV
Arreglos II
Curso Ensamblador x86
Parte XXVI
Arreglos III
Curso Ensamblador x86
Parte XXVII
Cadenas I
Curso Ensamblador x86
Parte XXVIII
Cadenas II
Curso Ensamblador x86
Parte XXIX
Cadenas III
Curso Ensamblador x86
Parte XXX
Cadenas IV
Curso Ensamblador x86
Parte XXXI
Archivos I
Curso Ensamblador x86
Parte XXXII
Archivos II
Curso Ensamblador x86
Parte XXXIII
Archivos III
Curso Ensamblador x86
Parte XXXIV
Archivos IV
Curso Ensamblador x86
Parte XXXV
Archivos V
Curso Ensamblador x86
Parte XXXVI
Manejo de la pila
Curso Ensamblador x86
Parte XXXVII
Manejo avanzado de la pantalla
Curso Ensamblador x86
Parte XXXVIII
Debug
Curso Ensamblador x86
Parte XXXIX
Bootloader
Curso Ensamblador x86
Parte XXXX
C y Ensamblador
Curso Ensamblador x86
Parte XXXXII
Reversing
-
Editor hexadecimal ( Sublime Text 3
http://facelessuser.github.io/HexViewer)
-
Desensamblador (https://rada.re/r/)
-
Codigos de operacion x86
#include <stdio.h>
int main(){
int contrasenia = 1;
if (contrasenia==2){
printf("Exito\n");
}
return 0;
}
~/Desktop $ ./ejemplo
~/Desktop $ sudo r2 -w ejemplo
-- What about taking a break? Here, have this nice 0xCC.
[0x00000520]> pd32
....
,=< 0x0000063d 750c jne 0x64b
| 0x0000063f 488d3d9e0000. lea rdi, qword str.Exito ; 0x6e4 ; "Exito"
| 0x00000646 e8c5feffff call sym.imp.puts
`-> 0x0000064b b800000000 mov eax, 0
....
[0x00000520]> 0x0000063d
[0x0000063d]> wx 740c
[0x0000063d]> pd32
,=< 0x0000063d 740c je 0x64b
| 0x0000063f 488d3d9e0000. lea rdi, qword str.Exito ; 0x6e4 ; "Exito"
| 0x00000646 e8c5feffff call sym.imp.puts
`-> 0x0000064b b800000000 mov eax, 0
~/Desktop $ ./ejemplo
Exito
¡GRACIAS!
Curso ensamblador
By neomatrix
Curso ensamblador
- 517