miércoles, 30 de octubre de 2019

Interrupciones en ensamblador.

Concepto de interrupciones.
Una interrupción es una situación especial que suspende la ejecución de un programa de modo que el sistema pueda realizar una acción para tratarla. Tal situación se da, por ejemplo, cuando un periférico requiere la atención del procesador para realizar una operación de E/S.
Las interrupciones constituyen quizá el mecanismo más importante para la conexión del microcontrolador con el mundo exterior, sincronizando la ejecución de programas con acontecimientos externos.

Pasos para el procesamiento.

1. Terminar la ejecución de la instrucción máquina en curso.

2. Salva el valor de contador de programa, IP, en la pila, de manera que en la CPU, al terminar el proceso, pueda seguir ejecutando el programa a partir de la última instrucción.

3. La CPU salta a la dirección donde está almacenada la rutina de servicio de interrupción (ISR, Interrupt Service Routine) y ejecuta esa rutina que tiene como objetivo atender al dispositivo que generó la interrupción.

4. Una vez que la rutina de la interrupción termina, el procesador restaura el estado que había guardado en la pila en el paso 2 y retorna al programa que se estaba usando anteriormente.

 
Ejemplos de interrupciones:

int 01h-->un solo paso
int 02h-->interrupcion no enmascarable
int 03h--> punto de interrupcion
int 04h-->desbordamiento
int 05h-->impresion de pantalla
int 08h-->Cronometro
int 15h-->Servicios del sistema
int 16h-->Funciones de entrada del teclado
int 18h-->Entrada con el Basic de Rom
int 19h-->Cargador ed arranque
int 1Ah-->Leer y establecer la hora
int 1Bh-->Obtener el control con una interrupcion de teclado.
int 2oh-->Terminar un programa
int 33h->Funciones del Raton

Instalación turbo assembler.

Link de descarga: https://sourceforge.net/projects/guitasm8086/







Registros principales para procesadores de 64 bits en ensamblador.

La CPU x86 tiene 14 registros internos y básicos. Algunos son realmente de 32 bits pero por ahora se utilizará el modo real que es compatible con el procesador 8086 (igualmente accesibles a la parte alta de éstos registros, inclusive en el modo real). Los registros son los siguientes (estos registros son de 16 bits nombrados de la siguiente manera, a excepción del registro de banderas).
Registros de uso general
  • AX: Acumulador (AL:AH)
  • BX: Registro base (BL:BH)
  • CX: Registro contador (CL:CH)
  • DX: Registro de datos (DL:DH)
Un registro es un espacio de almacenamiento disponible para el CPU. Una de las principales características de estos, es que pueden ser accedidos más rápido que cualquier otro dispositivo de almacenamiento de una computadora. Los procesadores x86 cuentan con una serie de registros disponibles para utilizar como almacenamiento temporal para variables, valores y demás información que utilizan durante la ejecución de instrucciones como así también punteros a secciones de memoria como la pila. Podemos mencionar 4 categorías diferentes:
  • Registros generales
  • Segmentos de registros
  • Flags (banderas de estado)
  • Instruction Pointer (IP), puntero a la próxima instrucción a ejecutar.

Registros generales

Normalmente, los registros generales almacenan datos o direcciones de memoria y son utilizados de manera intercambiable para lograr que se ejecuten las instrucciones del programa.  Algunos de estos registros generales son utilizados para funciones específicas. Por ejemplo, para realizar multiplicaciones o divisiones se utilizan los registros EAX EBX.

Flags

El registro que nombramos como EFLAG es un registro de estado. En esta arquitectura, tiene una longitud de 32 bits y cada uno de sus bits es una bandera. Según el valor de 0 o 1 de cada bit serán utilizados para controlar las operaciones de la CPU luego de la ejecución de una instrucción. Entre los registros más importantes para remarcar en relación al análisis de malware podemos enumerar:
  • ZF (Zero Flag): Este bit se activa cuando el resultado de una operación es igual a cero.
  • CF (Carry Flag): Este bit se activa cuando el resultado de una operación es muy grande o muy pequeño para el operador de destino.
  • SF (Sign Flag): Según si el resultado de una operación es un valor positivo o negativo. Si el valor es positivos se queda en cero y es uno en caso contrario.
  • TF (Trap Flag): Este flag se utiliza para depurar (debugging) un programa. En caso de que esté activo el procesador ejecutará una instrucción a la vez.

Un ejemplo práctico, la instrucción mov

De todas las instrucciones que se pueden ejecutar dentro de un procesador existen algunas de ellas que son las más comunes y habituales como así también las menos complejas. Una instrucción muy común es la instrucción mov cuya función es mover los datos desde una ubicación a otra. Esta instrucción utiliza dos operadores para realizar su trabajo. El primero es el destino al cual se quieren mover los datos y el segundo está relacionado con la dirección u ubicación de destino.

Dentro de los operadores con los que se puede utilizar la instrucción podemos incluir registros o direcciones de memoria directamente. A continuación podemos observar algunas de los usos más comunes de esta instrucción:

Lenguaje ensamblador.

El lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para escribir programas informáticos, y constituye la representación más directa del código máquina específico para cada arquitectura de microprocesador.
La importancia del lenguaje ensamblador es principalmente que se trabaja directamente con el microprocesador; por lo cual se debe de conocer el funcionamiento interno de este, tiene la ventaja de que en el se puede realizar cualquier tipo de programas que en los lenguajes de alto nivel no lo pueden realizar. Otro punto sería que los programas en ensamblador ocupan menos espacio en memoria.
• El único lenguaje que entienden los microcontroladores es el código máquina formado por ceros y unos del sistema binario.
• El lenguaje ensamblador expresa las instrucciones de una forma más natural al hombre a la vez que muy cercana al microcontrolador, ya que cada una de esas instrucciones se corresponde con otra en código máquina.


• El lenguaje ensamblador trabaja con nemónicos, que son grupos de caracteres alfanuméricos que simbolizan las órdenes o tareas a realizar.
•La traducción de los nemónicos a código máquina entendible por el microcontrolador la lleva a cabo un programa ensamblador.
• El programa escrito en lenguaje ensamblador se denomina código fuente (*.asm). El programa ensamblador proporciona a partir de este fichero el correspondiente código máquina, que suele tener la extensión *.hex.


Ventajas y desventajas del lenguaje ensamblador 
Ventajas
1. Como trabaja directamente con el microprocesador al ejecutar un programa, pues como este lenguaje es el mas cercano a la máquina la computadora lo procesa mas rápido.
2. Eficiencia de tamaño .- Un programa en ensamblador no ocupa mucho espacio en memoria porque no tiene que cargan librerías y demás como son los lenguajes de alto nivel.
3. Flexibilidad .- Es flexible porque todo lo que puede hacerse con una máquina, puede hacerse en el lenguaje ensamblador de esta máquina; los lenguajes de alto nivel tienen en una u otra forma limitantes para explotar al máximo los recursos de la máquina. O sea que en lenguaje ensamblador se pueden hacer tareas especificas que en un lenguaje de alto nivel no se pueden llevar acabo porque tienen ciertas limitantes que no se lo permite.
Desventajas
Tiempo de programación.
- Como es un lenguaje de bajo nivel requiere más instrucciones para realizar el mismo proceso, en comparación con un lenguaje de alto nivel. Por otro lado, requiere de más cuidado por parte del programador, pues es propenso a que los errores de lógica se reflejen más fuertemente en la ejecución.
Programas fuente grandes.
- Por las mismas razones que aumenta el tiempo, crecen los programas fuentes; simplemente requerimos más instrucciones primitivas para describir procesos equivalentes. Esto es una desventaja porque dificulta el mantenimiento de los programas, y nuevamente reduce la productividad de los programadores.
Peligro de afectar recursos inesperadamente. 
- Que todo error que podamos cometer, o todo riesgo que podamos tener, podemos afectar los recursos de la maquina, programar en este lenguaje lo más común que pueda pasar es que la máquina se bloquee o se reinicialize. Porque con este lenguaje es perfectamente posible (y sencillo) realizar secuencias de instrucciones inválidas, que normalmente no aparecen al usar un lenguaje de alto nivel.
Falta de portabilidad.
- Porque para cada máquina existe un lenguaje ensamblador; por ello, evidentemente no es una selección apropiada de lenguaje cuando deseamos codificar en una máquina y luego llevar los programas a otros sistemas operativos o modelos de computadoras.

Proyecto Egresados2 (Python, Django y conexión a MySQL)

Primero creamos nuestro proyecto.
django-admin startproject conexionegresados

Tenemos que instalar también la librería pymysql desde la ventana de comandos.


Después accedemos a nuestra carpeta recién creada.
cd conexionegresados

Al crear un nuevo archivo, nos pedirá realizar las migraciones necesarias. Este comando necesita ser ejecutado desde nuestra carpeta alumnos recién creada.
python manage.py migrate

Vamos a settings y en installed apps ingresamos el nombre de nuestro modelo, así como elegimos el idioma preferido de nuestro sitio, en nuestro caso ingresaremos es-es. En este caso como trabajaremos con MySQL también habrá que cambiar la base de datos. También hay que ingresar los siguientes datos en nuestro programa __init__

 

El código de nuestro modelo es el siguiente:

Realizamos la migración para que actualice el modelo recién ingresado.
Creamos nuestro super usuario:
python manage.py createsuperuser

Ingresamos nuestros datos en Django, para ingresar a Django seguimos la dirección que nos da cuando corremos el servidor, usualmente es 127.0.0.1:8000  y si queremos ingresar como admin sería 127.0.0.1:8000/admin


Comprobamos que nuestros datos se hayan ingresado correctamente a la base de datos, en este caso iremos a MySQL Workbench.

Proyecto Alumnos (Conexión entre Python y Django con sqlite3).

Primero creamos nuestro proyecto.
django-admin startproject alumnos

Después accedemos a nuestra carpeta recién creada.
cd alumnos

Al crear un nuevo archivo, nos pedirá realizar las migraciones necesarias. Este comando necesita ser ejecutado desde nuestra carpeta alumnos recién creada.
python manage.py migrate

Vamos a settings y en installed apps ingresamos el nombre de nuestro modelo, así como elegimos el idioma preferido de nuestro sitio, en nuestro caso ingresaremos es-es.


El código de nuestro modelo es el siguiente:


Realizamos la migración para que actualice el modelo recién ingresado.
Creamos nuestro super usuario:
Ingresamos nuestros datos en Django, para ingresar a Django seguimos la dirección que nos da cuando corremos el servidor, usualmente es 127.0.0.1:8000  y si queremos ingresar como admin sería 127.0.0.1:8000/admin 
 
 Comprobamos que nuestros datos se hayan ingresado correctamente a la base de datos.

Proyecto Egresados (Conexión entre Python y Django con sqlite3).

Primero creamos nuestro proyecto desde consola.
django-admin startproject egresados

Después accedemos a nuestra carpeta recién creada.
cd egresados

Al crear un nuevo archivo, nos pedirá realizar las migraciones necesarias. Este comando necesita ser ejecutado desde nuestra carpeta alumnos recién creada.
python manage.py migrate

Vamos a settings y en installed apps ingresamos el nombre de nuestro modelo, así como elegimos el idioma preferido de nuestro sitio, en nuestro caso ingresaremos es-es.


El código de nuestro modelo es el siguiente:


Realizamos la migración para que actualice el modelo recién ingresado.


Creamos nuestro super usuario:
python manage.py createsuperuser

Ingresamos nuestros datos en Django, para ingresar a Django seguimos la dirección que nos da cuando corremos el servidor, usualmente es 127.0.0.1:8000  y si queremos ingresar como admin sería 127.0.0.1:8000/admin


Comprobamos que nuestros datos se hayan ingresado correctamente a la base de datos.

jueves, 17 de octubre de 2019

Programa propio: Blockbuster.

El siguiente programa fue creado como ejemplo de una conexion entre mongoDB y Pycharm. Es un ejemplo de una terminal de renta de videojuegos de blockbuster.

Codigo:
https://drive.google.com/file/d/1bD2-1oHPGTCU3_Qy15lxTEjDN6nVtWI7/view?usp=sharing