miércoles, 27 de mayo de 2020

Aplicacion 1 Django - Estudiantes

Este proyecto es muy importante ya que es nuestra primera aplicacion con Django para python 3.8
Lo primero que hay que hacer es crear el proyecto desde el cmd , en este caso lo llamaremos estudiantes y se hace mediante el siguiente comando

Una vez hecho esto podemos verificar en el almacenamiento que se creara dicha carpeta para el proyecto
Despues pasamos a crear lo que viene siendo nuestra aplicacion para guardar los datos en este caso lo llamaremos datos_personales siendo creada desde el cmd
Pasamos a nuestro IDE en este caso pycharm y buscamos dicho carpeta y observamos todos los archivos .py que se crearon
De igual manera desde el cmd podemos revisar con el directorio todos los archivos que se crearon
Lo siguiente por hacer es correr el servidor mediante el siguiente comando desde el cmd
python3 manage.py runserver
Una vez que corrio el servidor se le va a asignar una direccion ip  que ingresaremos en el navegador o bien la direccion localhost:8080
Con esto podemos ver que se hizo la instalacion correctamente , cabe recordar que cada que se pierda la conexion es necesario volver a correr el servidor para poder acceder
Lo siguiente sera en el archivo models.py agregar los modelos o campos que se van a necesitar , esto se hace directamente en el IDE mediante el siguiente codigo en pyhton:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models

# Create your models here.
class Datospersonales(models.Model):
num_cont=models.CharField(max_length=10,primary_key=True)
ApellidoPaterno= models.CharField(max_length=55)
ApellidoMaterno= models.CharField(max_length=35)
Nombres = models.CharField(max_length=35)
DNI=models.CharField(max_length=8)
FechaNacimiento=models.DateField()
SEXOS= (('F','Femenino'),('M','Masculino')) #arreglo
sexo=models.CharField(max_length=1,choices=SEXOS,default='M')
Podemos observar que se crea a traves de una clase en la cual se van metiendo los modelos en este caso las cajas donde se va a guardar la informacion 

Despues en el archivo admin.py se importan los modelos creados con el siguiente codigo:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.contrib import admin

# Register your models here.
from .models import Datospersonales
admin.site.register(Datospersonales)
Y por ultimo en el archivo settings.py en las apps agregadas , debemos agregar datos_personales con el siguiente codigo:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'datos_personales'
]
Lo siguiente sera migrar el manage.py desde el cmd con el siguiente comando:
python3 manage.py migrate 
Y observamos que se migraron todos los complementos
Y ya nadamas para confirmar que se guardo se ingresa el siguiente comando para las migraciones:
python3 manage.py makemigrations
Despues es necesario crear un superusuario esto tambien se hace desde el cmd con el comando :
python3 manage.py create superuser
despues se agrega la informacion como correo , nombre y password
Procedemos de nuevo con la direccion ip agregando la palabra admin para poder acceder desde el navegador y nos muestra lo siguiente:
la direcion es 127.0.0.1:8000/admin
Ingresamos la informacion que capturamos anteriormente
Ahora procedemos al formulario y llenamos los campos correspondientes
Para verificamos que la informacion se guardo correctamente nos dirigimos a sqlite manager para ver las bases de datos que tenemos 




martes, 12 de mayo de 2020

Introduccion a Django

Despues de haber revisado de manera concreta y haber analizado el video que la maestra nos proporciono pude concluir ciertas cosas  y me di a la tarea de investigar un poco mas acerca de DJANGO















Es tan popular entre los programadores que tiene su propio sitio web , podemos observar que la ultima version es la 3.0.6 la cual es la que instalamos para la version 3.8 de Python en el anterior ejercicio  
Pudimos obtener la siguiente informacion la cual nos puede llegar a ser muy util:

Django es un framework de desarrollo web de código abierto, escrito en Python, que respeta el patrón de diseño conocido como MVC (Modelo–Vista–Controlador). Fue desarrollado en origen para gestionar varias páginas orientadas a noticias de la World Company de Lawrence, Kansas, y fue liberada al público bajo una licencia BSD en julio de 2005; el framework fue nombrado en alusión al guitarrista de jazz gitano Django Reinhardt. En junio de 2008 fue anunciado que la recién formada Django Software Foundation se haría cargo de Django en el futuro.


La meta fundamental de Django es facilitar la creación de sitios web complejos. Django pone énfasis en el re-uso, la conectividad y extensibilidad de componentes, el desarrollo rápido y el principio No te repitas (DRY, del inglés Don't Repeat Yourself). Python es usado en todas las partes del framework, incluso en configuraciones, archivos, y en los modelos de datos.

Otras características de Django son:

Un mapeador objeto-relacional.
Aplicaciones "enchufables" que pueden instalarse en cualquier página gestionada con Django.
Una API de base de datos robusta.
Un sistema incorporado de "vistas genéricas" que ahorra tener que escribir la lógica de ciertas tareas comunes.
Un sistema extensible de plantillas basado en etiquetas, con herencia de plantillas.
Un despachador de URLs basado en expresiones regulares.
Un sistema "middleware" para desarrollar características adicionales; por ejemplo, la distribución principal de Django incluye componentes middleware que proporcionan cacheo, compresión de la salida, normalización de URLs, protección CSRF y soporte de sesiones.
Soporte de internacionalización, incluyendo traducciones incorporadas de la interfaz de administración.
Documentación incorporada accesible a través de la aplicación administrativa (incluyendo documentación generada automáticamente de los modelos y las bibliotecas de plantillas añadidas por las aplicaciones).

Django también es una plataforma habitual que brinda múltiples herramientas
Arquitectura
Aunque Django está fuertemente inspirado en la filosofía de desarrollo Modelo Vista Controlador, sus desarrolladores declaran públicamente que no se sienten especialmente atados a observar estrictamente ningún paradigma particular, y en cambio prefieren hacer "lo que les parece correcto". Como resultado, por ejemplo, lo que se llamaría "controlador" en un "verdadero" framework MVC se llama en Django "vista", y lo que se llamaría "vista" se llama "plantilla".

Gracias al poder de las capas mediator y foundation, Django permite que los desarrolladores se dediquen a construir los objetos Entity y la lógica de presentación y control para ellos.

Presentación
Aquí se maneja la interacción entre el usuario y el computador. En Django, esta tarea la realizan el motor de plantillas y el cargador de plantillas que toman la información y la presentan al usuario (vía HTML, por ejemplo). El sistema de configuración de URLs es también parte de la capa de presentación.

Control
En esta capa reside el programa o la lógica de aplicación en sí. En Django son representados por las vistas y los manipuladores. La capa de presentación depende de ésta y a su vez ésta depende de la capa de dominio.

Mediator
Es el encargado de manejar la interacción entre el subsistema Entity y foundation. Aquí se realiza el mapeo objeto-relacional a cargo del motor de Django.

Entity
El subsistema entity maneja los objetos de negocio. El mapeo objeto-relacional de Django permite escribir objetos de tipo entity de una forma fácil y estándar.

Foundation
La principal tarea del subsistema foundation es la de manejar a bajo nivel el trabajo con la base de datos. Se provee soporte a nivel de foundation para varias bases de datos y otras están en etapa de prueba.
Soporte de bases de datos
Respecto a la base de datos, la recomendada es PostgreSQL, pero también son soportadas MySQL y SQLite 3. Se encuentra en desarrollo un adaptador para Microsoft SQL Server. Una vez creados los modelos de datos, Django proporciona una abstracción de la base de datos a través de su API que permite crear, recuperar, actualizar y borrar objetos. También es posible que el usuario ejecute sus propias consultas SQL directamente. En el modelo de datos de Django, una clase representa un registro de una tabla en la base de datos y las instancias de ésta serán las tuplas en la tabla.

Soporte de servidores Web
Como mencionamos en los requisitos, Django incluye un servidor web liviano para realizar pruebas y trabajar en la etapa de desarrollo. En la etapa de producción, sin embargo, se recomienda Apache 2 con mod_python. Aunque Django soporta la especificación WSGI, por lo que puede correr sobre una gran variedad de servidores como FastCGI o SCGI en Apache u otros servidores (particularmente Lighttpd).

Requerimientos
Django requiere Python 2.5 o superior. No se necesitan otras bibliotecas de Python para poder obtener una funcionalidad básica. En un entorno de desarrollo –especialmente si queremos experimentar con Django—no necesitamos un web server instalado, ya que Django trae su propio servidor liviano para éste propósito, con la restricción de solo permitir un usuario a la vez..

Base de datos PostgreSQL, MySQL, Oracle o SQLite.

Otro dato muy importante que pudimos observar en el sitio oficial es que te da una buen introduccion y te ofrece practicas por si es que quieres iniciar a formar tus primeras aplicaciones con DJANGO

lunes, 11 de mayo de 2020

Uso de herramienta Pip en Python 2.7 y 3.8

Despues de haber visto el video realizado por la maestra mostraremos el manejo de Pip desde nuestro ordenador  , empezare por mostrarles como es que tengo distribuidos los interpretes de Python para la version 2.7 y la 3.8

















Podemos observar que estan en 2 carpetas distintas  una llamada Python 27 y la otra Python 38  haciendo enfasis a cada interprete 
 Para mayor comodidad y facilidad renombramos el ejecutable como Python 2 y Python 3 para poder hacerlo desde la consola con una mayor facilidad y no tener que pensar en cual es el que se ejecutara primero al escribir Python


Ahora nos iremos a las variables de entorno para verificar que al hacer la instalacion se agregaran de forma correcta, ya que ahora nos da la ventaja de agregarlo al PATH al momento de instalarlo para ya no tener que hacerlo despues 


Podemos observar que ambos interpretes estan agregados de manera correcta  como variables de entorno , ademas de la respectiva carpeta de scripts donde vamos a trabajar con las librerias , ya que verificamos pasamos a la consola a ejecutar y volver a verificar que en efecto los lee de manera adecuada










Podemos observar que en efecto para ambos interpretes se reconoce de manera correcta al ingresar el nombre segun lo asignamos .

Despues de ello procederemos a trabajar con la herramienta pip para la instalacion de una libreria , en este caso "DJANGO" el framework mas de moda en la actualidad para todos los programadores

Para ello lo vamos a hacer desde la ventana de comandos 

 Ahora lo haremos para la version 2.7  igual desde la ventana de comandos


Ahora bien nos dirigimos al IDE en este caso pycharm y verificamos nuestros interpretes , segun la necesidad de programacion que tengamos es el que vamos a elegir para que lea los programas

Podemos ver algunas de las librerias que tenemos como podemos observar Django para la version 3.8 se instalo correctamente

 

Al igual para la version 2.7 podemos observar la instalacion correcta de la libreria Django 

La herramienta pip es de gran utilidad para la instalacion de la libreria o bien si lo queremos lo podemos hacer desde el IDE nadamas escogiendo de manera correcta el interprete que vamos a utilizar para instalar y buscar librerias 

viernes, 1 de mayo de 2020

Tema Modularizacion Lenguajes de Interfaz

Modularizacion

¿Qué es modularización?
Básicamente es crear varias rutinas (funciones o procedimientos) y asi segmentar el código y hacerlo mas entendible para el programador ya sea para actualizaciones o depuraciones

¿Que es un modulo?
Un modulo es un segmento, rutina, subrutina, sub algoritmo o procedimiento, que puede definirse dentro de un algoritmo con el fin de ejecutaruna tarea especifica y puede ser llamado o invocado desde el algoritmo principal cuando sea necesario.

¿Cuando es útil la modularización?
Este enfoque de segmentación o modularización es útil en dos casos :

Cuando existe un grupo de instrucciones o una tarea especifica que deba ejecutarse en más de una ocasión.

Cuando un problema es complejo o extenso, la solución se “divide” o“segmenta” en módulos que ejecutan “partes” o tareas especificas. Dicha solución se organiza de forma similar a como lo hacen las empresas cuando se estructuran con base en las funciones para realizar sus actividades; en otras palabras, el trabajo se divide en partes que sean fácilmente manejables y que , lógicamente, puedan ser separadas ; así, cada una de estas partes se dedica a ejecutar una determinadatarea, lo que redundara en una mayor concentración , entendimiento y capacidad de solución a la hora de diseñar la lógica de cada una de estas. Dichas partes son módulos o segmentos del algoritmo, algunos de ellos son los módulos directivos o de control, que son los que se encargaran de distribuir el trabajo de los demás módulos. De esta manera se puede diseñar un organigrama que indique la estructura general de un algoritmo.

Procedimientos

Un procedimiento es una secuencia de instrucciones que en conjunto llevan a cabo una tarea específica.

En programación un procedimiento es un segmento de código que cuenta con instrucciones a las cuales se puede acceder desde cualquier parte del programa y una vez se termina la ejecución de estas, el programa continua con su ejecución normal, tomando el control la siguiente línea después de la llamada al procedimiento. Los procedimientos tienden a ser grupos de instrucciones que se necesitara ejecutar más de una vez dentro de un programa, ya que un procedimiento puede ser llamado en cualquier momento durante la ejecución del programa principal, la cantidad de veces que sea necesario sin necesidad de reescribir el código.

En ensamblador los procedimientos están conformados por las siguientes partes:

Declaración del procedimiento:

Los procedimientos en ensamblador se declaran mediante la sintaxis nombreprocedimiento Proc [far/near] dependiendo de si es un procedimiento cercano o lejano.

Código del procedimiento:

Dentro del procedimiento se escribe el código de ensamblador que se quiere utilizar.


REPORT THIS AD

Directiva de regreso:

Antes del final de un procedimiento en ensamblador se escribe la directiva de regreso ret,, la cual regresa el control a la línea desde donde fue llamado el procedimiento.

Terminación del procedimiento:

Para terminar un procedimiento se escribe el nombre del procedimiento seguido de la palabra reservaba endp.

Existen dos tipos de procedimientos que pueden utilizarse dentro de ensamblador, estos son los internos y los externos.

Procedimientos Internos:

Estos procedimientos son aquellos que son declarados dentro del mismo archivo de programa que serán llamados, también se les llama procedimientos locales.

Para utilizarlos basta con escribir la palabra reservada call seguida del nombre del procedimiento a utilizar.

 

Procedimientos Externos:

Los procedimientos externos se crean de la misma forma que los internos pero tienen la diferencia de que están en archivos separados al programa de donde el procedimiento es llamado, por lo que se necesitan instrucciones extra para poder utilizarlos, las cuales son las siguientes:


REPORT THIS AD

PUBLIC:

Es necesario declarar como publico el procedimiento que se desea utilizar para que sea posible acceder a él desde otro programa.

EXTRN:

Permite abrir procedimientos desde otro programa aunque no se encuentre enlazado directamente.

INCLUDE:

Enlaza el programa que llama el procedimiento con el que lo contiene, permitiendo utilizarlo como si fuera un procedimiento propio.

Ejemplo:
public imprime               →       Procedimiento dentro del primero archivo declarado como                                                                         publico.
imprime proc far           →              Declaracion del procedimiento.
mov ah,09h                     →             Código del procedimiento
int 21h
ret                                     →            Directiva de regreso.
imprime endp                 →            Fin del procedimiento.

extrn imprime:near      →             Se incluye el procedimiento externo imprime en el                                                                                           segundo archivo.
call imprime                   →              Se llama al procedimiento como si fuera local.

MACROS


Definición de una macro
Una macro es un grupo de instrucciones repetitivas en un programa que se codifican solo una vez y pueden utilizarse cuantas veces sea necesario.

La principal diferencia entre una macro y un procedimiento es que en la macro se hace posible el paso de parámetros y en el procedimiento no.

Podemos decir entonces que unprocedimiento es una extensión de un determinado programa, mientras que la macro es un módulo con funciones específicas que puede ser utilizado por diferentes programas.

Sintaxis de una macro
Las partes que componen a una macro son:
* Declaración de la macro
* código de la macro
* Directiva de terminación de la macro

La declaración de la macro se lleva a cabo de lasiguiente forma:

NombreMacro MACRO [parametro1, parametro2...]

Aunque se tiene la funcionalidad de los parámetros es posible crear una macro que no los necesite.

La directiva de terminación de la macro es: ENDM

Un ejemplo de macro, para colocar el cursor en alguna posición determinada de la pantalla es:

Posicion MACRO Fila, Columna
PUSH AX
PUSH BX
PUSH DX
MOV AH, 02H
MOV DH, Fila MOV DL, Columna
MOV BH, 0
INT 10H
POP DX
POP BX
POP AX
ENDM

Para utilizar una macro solo es necesario llamarla por su nombre, como si fuera una instrucción más del ensamblador, ya no son necesarias las directivas como en el caso de los procedimientos.

Para cada instrucción simbólica que usted codifica, el ensamblador genera una instrucción de lenguaje de maquina. El ensambladortiene facilidades que el programador puede utilizar para definir macros. Primero hay que definir un nombre especifico para la macro, junto con el conjunto de instrucciones en lenguaje ensamblador que la macro va a generar. Después, siempre que necesite codificar el conjunto de instrucciones, solo hay que codificar el nombre de la macro y el ensamblador genera de forma automática lasinstrucciones que han sido definidas en la macro.

Las macros son útiles para los siguientes propósitos:


* Simplificar y reducir la cantidad de codificación repetitiva.
* Reducir errores causados por la codificación repetitiva.
* Linealizar un programa en lenguaje ensamblador para hacerlo mas legible.

Unidad 2 Lenguajes de Interfaz

Unidad 2 Programación Básica


2.1 Ensamblador (y ligador) a utilizar

Aunque todos los ensambladores realizan básicamente las mismas tareas, podemos clasificarlos de acuerdo a características. 

Así podemos clasificarlos en: 
Ensambladores Cruzados (Cross-Assembler). 

Se denominan así los ensambladores que se utilizan en una computadora que posee un procesador diferente al que tendrán las computadoras donde va a ejecutarse el programa objeto producido. 

El empleo de este tipo de traductores permite aprovechar el soporte de medios físicos (discos, impresoras, pantallas, etc.), y de programación que ofrecen las máquinas potentes para desarrollar programas que luego los van a ejecutar sistemas muy especializados en determinados tipos de tareas. 

Ensambladores Residentes. 
Son aquellos que permanecen en la memoria principal de la computadora y cargan, para su ejecución, al programa objeto producido. Este tipo de ensamblador tiene la ventaja de que se puede comprobar inmediatamente el programa sin necesidad de transportarlo de un lugar a otro, como se hacía en cross-assembler, y sin necesidad de programas simuladores. 

Sin embargo, puede presentar problemas de espacio de memoria, ya que el traductor ocupa espacio que no puede ser utilizado por el programador. Asimismo, también ocupará memoria el programa fuente y el programa objeto. Esto obliga a tener un espacio de memoria relativamente amplio. Es el indicado para desarrollos de pequeños sistemas de control y sencillos automatismo empleando microprocesadores. 

La ventaja de estos ensambladores es que permiten ejecutar inmediatamente el programa; la desventaja es que deben mantenerse en la memoria principal tanto el ensamblador como el programa fuente y el programa objeto. Macroensambladores.
Son ensambladores que permiten el uso de macroinstrucciones (macros). Debido a su potencia, normalmente son programas robustos que no permanecen en memoria una vez generado el programa objeto. Puede variar la complejidad de los mismos, dependiendo de las posibilidades de definición y manipulación de las macroinstrucciones, pero normalmente son programas bastantes complejos, por lo que suelen ser ensambladores residentes. 

Microensambladores. 
Generalmente, los procesadores utilizados en las computadoras tienen un repertorio fijo de instrucciones, es decir, que el intérprete de las mismas interpretaba de igual forma un determinado código de operación.

El programa que indica al intérprete de instrucciones de la UCP cómo debe actuar se denomina microprograma. El programa que ayuda a realizar esta microprograma se llama microensamblador. Existen procesadores que permiten la modificación de sus microprogramas, para lo cual se utilizan microensambladores. 

Ensambladores de una fase. 
Estos ensambladores leen una línea del programa fuente y la traducen directamente para producir una instrucción en lenguaje máquina o la ejecuta si se trata de una pseudoinstrucción. También va construyendo la tabla de símbolos a medida que van apareciendo las definiciones de variables, etiquetas, etc. 

Debido a su forma de traducción, estos ensambladores obligan a definir los símbolos antes de ser empleados para que, cuando aparezca una referencia a un determinado símbolo en una instrucción, se conozca la dirección de dicho símbolo y se pueda traducir de forma correcta. Estos ensambladores son sencillos, baratos y ocupan poco espacio, pero tiene el inconveniente indicado. Ensambladores de dos fases. 

Los ensambladores de dos fases se denominan así debido a que realizan la traducción en dos etapas. En la primera fase, leen el programa fuente y construyen una tabla de símbolos; de esta manera, en la segunda fase, vuelven a leer el programa fuente y pueden ir traduciendo totalmente, puesto que conocen la totalidad de los símbolos utilizados y las posiciones que se les ha asignado. Estos ensambladores son los más utilizados en la actualidad. 


2.2 Ciclos numéricos 

La arquitectura de los procesadores x86 obliga al uso de segmentos de memoria para manejar la información, el tamaño de estos segmentos es de 64kb.

La razón de ser de estos segmentos es que, considerando que el tamaño máximo de un número que puede manejar el procesador esta dado por una palabra de 16 bits o registro, no sería posible accesar a más de 65536 localidades de memoria utilizando uno solo de estos registros, ahora, si se divide la memoria de la pc en grupos o segmentos, cada uno de 65536 localidades, y utilizamos una dirección en un registro exclusivo para localizar cada segmento, y entonces cada dirección de una casilla específica la formamos con dos registros, nos es posible acezar a una cantidad de 4294967296 bytes de memoria, lo cual es, en la actualidad, más memoria de la que veremos instalada en una PC. 

Para que el ensamblador pueda manejar los datos es necesario que cada dato o instrucción se encuentren localizados en el área que corresponde a sus respectivos segmentos. El ensamblador accesa a esta información tomando en cuenta la localización del segmento, dada por los registros DS, ES, SS y CS, y dentro de dicho registro la dirección del dato específico. 

2.3 Captura básica de cadenas.

Dentro del lenguaje ensamblador no existe el tipo de dato cadena (string en otros lenguajes), por lo que para utilizarla es necesario tratar a las cadenas como un conjunto de caracteres reservados bajo el nombre de una sola variable.

El lenguaje ensamblador cuenta con instrucciones que por su naturaleza sirven para el manejo de cadenas, estas son:

MOVSB: Mueve un byte desde una localidad de memoria hasta otra.

MOVSW: Mueve una palabra desde una localidad de memoria hasta otra.

LODSB: Carga en la parte baja del registro acumulador (AL) el valor de la localidad de memoria determinada por DS:SI.

LODSW: Carga en el registro acumulador (AX) el valor de la localidad de memoria determinada por DS:SI.


2.4 Comparación y prueba 

La instrucción CMP pro lo común es utilizada para comparar dos campos de datos, uno de los cuales están contenidos en un registro. El formato general para CMP es:| [etiqueta:] | CMP | {registro/memoria}, {registro/memoria/inmediato} | Observe que la operación compara el primer operando con el segundo; por ejemplo, el valor del primer operando es mayor que, igual o menor que el valor del segundo operando? 

La instrucción CMPS compara el contenido de una localidad de memoria (direccionada por DS:SI). Dependiendo de la bandera de dirección, CMPS incrementa o disminuye también los registros SI y DI en 1 para bytes, en 2 para palabras y en 4 para palabras dobles. La operación establece las banderas AF, CF, OF, PF, SF y ZF. 

Cuando se combinan con un prefijo REP y una longitud en el CX, de manera sucesiva CMPS puede comparar cadenas de cualquier longitud.

Pero observe que CMPS proporciona una comparación alfanumérica, esto es, una comparación de acuerdo a con los valores ASCII. Considere la comparación de dos cadenas que contienen JEAN y JOAN 

Algunas derivaciones de CMPS son las siguientes: 
CMPSB. Compara bytes 
CMPSD. Compara palabras dobles 
CMPSW. Compara palabras

2.5 Saltos

La mayoría de los programas constan de varios ciclos en los que una serie de pasos se repite hasta alcanzar un requisito específico y varias pruebas para determinar qué acción se realiza de entre varias posibles. 

Una instrucción usada comúnmente para la transferencia de control es la instrucción JMP (jump, salto, bifurcación).  Un salto es incondicional, ya que la operación transfiere el control bajo cualquier circunstancia. También JMP vacía el resultado de la instrucción previamente procesada; por lo que, un programa con muchas operaciones de salto puede perder velocidad de procesamiento.

La instrucción LOOP, requiere un valor inicial en el registro CX. En cada iteración, LOOP de forma automática disminuye 1 de CX. Si el valor en el CX es cero, el control pasa a la instrucción que sigue; si el valor en el CX no es cero, el control pasa a la dirección del operando. La distancia debe ser un salto corto, desde -128 hasta +127 bytes. Para una operación que exceda este límite, el ensamblador envía un mensaje como "salto relativo fuera de rango". 








2.6 Ciclos condicionales


Sintaxis:   LOOP etiqueta 

La instrucción loop decrementa CX en 1, y transfiere el flujo del programa a la etiqueta dada como operando si CX es diferente a 1. 

Instrucción LOOPE 

Propósito: Generar un ciclo en el programa considerando el estado de ZF 

Sintaxis:   LOOPE etiqueta 

Esta instrucción decrementa CX en 1. Si CX es diferente a cero y ZF es igual a 1, entonces el flujo del programa se transfiere a la etiqueta indicada como operando. 

Instrucción LOOPNE 

Propósito: Generar un ciclo en el programa, considerando el estado de ZF 

Sintaxis:   LOOPNE etiqueta 

Esta instrucción decrementa en uno a CX y transfiere el flujo del programa solo si ZF es diferente a 0.

2.7 Incremento y decremento 

Son las instrucciones más básicas a la hora de hacer operaciones con registros: INC incrementa el valor de un registro, o de cualquier posición en memoria, en una unidad, y DEC lo decrementa.

Instrucción INC INC  AX Incrementa en uno el valor de AX IN WORD PTR  Incrementa la palabra situada en CS.

Instrucción DEC DEC   AX Decremento AX, le resta uno. DEC WORD PTR Decrementa la palabra situada en CS.

2.8 Captura de cadenas con formato


MOV
Transfiere datos entre celdas de memoria y registros. 

Sintaxis:                     MOV Destino, Fuente

Ejemplo:
      MOV AX,0006h 
      MOV DX,AX 


MOVS (MOVSB) (MOVSW)
Mueve cadenas de bytes o palabras desde la fuente, direccionada por SI, hasta el destino direccionado por DI. 

Sintaxis:                     MOVS 

Este comando no necesita parámetros ya que toma como dirección fuente el contenido del registro SI y como destino el contenido de DI. 

Ejemplo:

      MOV SI, OFFSET VARIABLE1 
      MOV DI, OFFSET VARIABLE2 
      MOVS 


Primero se inicializan los valores de SI y DI con las direcciones de las variables VARIABLE1 y VARIABLE2 respectivamente, despues al ejecutar MOVS se copia el contenido de VARIABLE1 a VARIABLE2. 

Los comandos MOVSB y MOVSW se utilizan de la misma forma que MOVS, el primero mueve un byte y el segundo una palabra. 


LODS (LODSB) (LODSW)
Carga cadenas de un byte o palabra al acumulador. 

Sintaxis:         LODS 

Toma la cadena que se encuentre en la dirección especificada por SI, la carga al registro AL (o AX) y suma o resta 1 (segun el estado de DF) a SI si la transferencia es de bytes o 2 si la transferencia es de palabras. 

 Ejemplo:
      MOV SI, OFFSET VARABLE1 
      LODS 

La primer linea carga la dirección de VARIABLE1 en SI y la segunda linea lleva el contenido de esa localidad al registro AL. 

Los comandos LODSB y LODSW se utilizan de la misma forma, el primero carga un byte y el segundo una palabra (utiliza el registro completo AX). 


LAHF
Transfiere al registro AH el contenido de las banderas 

Sintaxis:         LAHF 

Se utiliza para verificar el estado de las banderas durante la ejecución de un programa.

Las banderas quedan en el siguiente orden dentro del registro:

            SF ZF __ AF __ PF __ CF 


LEA
Carga la dirección del operando fuente.

Sintaxis:         LEA destino, fuente 

El operando fuente debe estar ubicado en memoria, y se coloca su desplazamiento en el registro índice o apuntador especificado en destino. 

Ejemplo:
                  MOV SI, OFFSET VAR1 
                  Que es equivalente a:
                  LEA SI, VAR1 


POP
Recupera un dato de la pila 

Sintaxis:                     POP destino 

Transfiere el último valor almacenado en la pila al operando destino y después incrementa en dos el registro SP. 

Este incremento se debe a que la pila va creciendo desde la dirección mas alta de memoria del segmento hacia la mas baja, y la pila solo trabaja con palabras (2 bytes), entonces al incrementar en dos el registro SP realmente se le esta restando dos al tamaño real de la pila. 


POPF 
Extrae las banderas almacenadas en la pila. 

Sintaxis:                     POPF 

Transfiere bits de la palabra almacenada en la parte superior de la pila hacia el registro de banderas. 

La forma de transferencia es la siguiente: 

  BIT BANDERA    0 CF ___ 2 PF ___ 4 AF ___  6 ZF  7 SF  8 TF  9 IF  10 DF  11 OF
Estas localizaciones son las mismas para el comando PUSHF
Una vez hecha la transferencia se incrementa en 2 el registro SP disminuyendo así el tamaño de la pila. 


PUSH
Coloca una palabra en la pila. 

Sintaxis:         PUSH fuente 

La instrucción PUSH decrementa en dos el valor de SP y luego transfiere el contenido del operando fuente a la nueva dirección resultante en el registro recién modificado.
El decremento en la dirección se debe a que al agregar valores a la pila ésta crece de la dirección mayor a la dirección menor del segmento, por lo tanto al restarle 2 al valor del registro SP lo que hacemos es aumentar el tamaño de la pila en dos bytes, que es la única cantidad de información que puede manejar la pila en cada entrada y salida de datos.

PUSHF
Coloca el valor de las banderas en la pila 

Sintaxis:         PUSHF 

Decrementa en 2 el valor del registro SP y luego se transfiere el contenido del registro de banderas a la pila, en la dirección indicada por SP. 

Las banderas quedan almacenadas en memoria en los mismos bits indicados en el comando POPF

2.9 Instrucciones aritméticas


ADC 
Adición con acarreo. 

Sintaxis:         ADC destino, fuente 

Lleva a cabo la suma de dos operandos y suma uno al resultado en caso de que la bandera CF esté activada, esto es, en caso de que exista acarreo. 

El resultado se guarda en el operando destino. 


ADD 
Adición de los operandos. 

Sintaxis:         ADD destino, fuente 

Suma los dos operandos y guarda el resultado en el operando destino. 


DIV
División sin signo 

Sintaxis:         DIV fuente 

El divisor puede ser un byte o palabra y es el operando que se le da a la instrucción. 

Si el divisor es de 8 bits se toma como dividendo el registro de 16 bits AX y si el divisor es de 16 bits se tomara como dividendo el registro par DX:AX, tomando como palabra alta DX y como baja AX. 

Si el divisor fue un byte el cociente se almacena en el registro AL y el residuo en AH, si fué una palabra el cociente se guarda en AX y el residuo en DX. 


IDIV
División con signo 

Sintaxis:         IDIV fuente 

Consiste básicamente en lo mismo que la instrucción DIV, solo que esta última realiza la operación con signo. 


MUL
Multiplicación sin signo 

Sintaxis:         MUL fuente 

El ensamblador asume que el multiplicando será del mismo tamaño que el del multiplicador, por lo tanto multiplica el valor almacenado en el registro que se le da como operando por el que se encuentre contenido en AH si el multiplicador es de 8 bits o por AX si el multiplicador es de 16 bits. 

Cuando se realiza una multiplicación con valores de 8 bits el resultado se almacena en el registro AX y cuando la multiplicación es con valores de 16 bits el resultado se almacena en el registro par DX:AX. 


IMUL
Multiplicación de dos enteros con signo. 

Sintaxis:         IMUL fuente 

Este comando hace lo mismo que el anterior, solo que si toma en cuenta los signos de las cantidades que se multiplican. 

Los resultados se guardan en los mismos registros que en la instrucción MUL.


SBB
Sbstracción con acarreo 

Sintaxis:         SBB destino, fuente 

Esta instrucción resta los operandos y resta uno al resultado si CF está activada. El operando fuente siempre se resta del destino. 

Este tipo de substracción se utiliza cuando se trabaja con cantidades de 32 bits. 


SUB
Substracción 

Sintaxis:         SUB destino, fuente 

Resta el operando fuente del destino.


2.10 Manipulación de la pila 

-ROT        (a b c – c a b)                   Rota hacia atrás.
-2ROT      (ab cd ef – ef ab cd)         Rota hacia atrás.
NIP           ( a b – b)                          Quita a de la pila.
OUTK       (... n -- ..)                          Elimina el elemento n.
TUCK       (a b -- b a b)                     Inserta una copia de b.
2?DUP     (ab – ab ab)                      Duplica si ab <> 0.
2DROP     (ab -- )                              Elimina 2 de encima.
2DUP        ( ab – ab ab)                    Duplica los elementos.
2NIP          (ab cd – cd)                     Elimina elementos.
2OUTK      (::: n -- ::)                         Elimina el elemento n
2OVER      (ab cd – ab cd ab)           Inserta una copia de ab.
2PICK        (:: n -- :::)                         Copia el elemento n  encima de la pila.
2ROLL       (::: n -- :::)                        Quita el elemento n y lo deja arriba de la pila.
2ROT         (ab cd ef – cd ef ab)        Rota los elementos
2TUCK       (ab cd – cd ab cd)           Inserta una copia de cd.
2SWAP       (ab cd – cd ab)               Rota los elementos.

2.11 Obtención de cadena con representación decimal 

En este modo, los datos son proporcionados directamente como parte de la instrucción. 

Ejemplo: 
Mov AX,34h ;Copia en AX el número 34h hexadecimal 
Mov CX,10 ;Copia en CX el número 10 en decimal


2.12 Instrucciones lógicas


AND
Realiza la conjunción de los operandos bit por bit. 

Sintaxis:         AND destino, fuente 

Con esta instrucción se lleva a cabo la operación "y" lógica de los dos operandos: 

NEG
Genera el complemento a 2 

Sintaxis:         NEG destino 

Genera el complemento a 2 del operando destino y lo almacena en este mismo operando. 

Ejemplo, si AX guarda el valor de –2 (FFFE), entonces:                    NEG AX 

Dejaría como resultado en AX el valor 0002. 

NOT
Lleva a cabo la negación bit por bit del operando destino. 

Sintaxis:         NOT destino 

El resultado se guarda en el mismo operando destino. 


OR
OR inclusivo lógico 

Sintaxis:         OR destino, fuente

La instrucción OR lleva a cabo, bit por bit, la disyunción inclusiva lógica de los dos operandos: 



TEST
Compara lógicamente los operandos 

Sintaxis:         TEST destino, fuente

Realiza una conjunción, bit por bit, de los operandos, pero a diferencia de AND esta instrucción no coloca el resultado en el operando destino, solo tiene efecto sobre el estado de las banderas. 


XOR
OR exclusivo 

Sintaxis:         XOR destino, fuente 

Su función es efectuar bit por bit la disyunción exclusiva lógica de los dos operandos. 



2.13 Desplazamiento y rotación 


Las instrucciones de corrimiento, que son parte de la capacidad lógica de la computadora, pueden realizar las siguientes acciones: 
  
1. Hacer referencia a un registro o dirección de memoria. 
2. Recorre bits a la izquierda o a la derecha. 
3. Recorre hasta 8 bits en un byte, 16 bits en una palabra y 32 bits en una palabra doble. 
4. Corrimiento lógico (sin signo) o aritmético (con signo).

El segundo operando contiene el valor del corrimiento, que es una constante (un valor inmediato) o una referencia al registro CL. Para los procesadores 8088/8086, la constante inmediata solo puede ser 1; un valor de corrimiento mayor que 1 debe estar contenido en el registro CL. Procesadores posteriores permiten constantes de corrimiento inmediato hasta 31. 

El formato general para el corrimiento es  


DESPLAZAMIENTO O CORRIMIENTO DE BITS HACIA LA DERECHA. 
Los corrimientos hacia la derecha (SHR y SAR) mueven los bits hacia la derecha en el registro designado. El bit recorrido fuera del registro mete la bandera de acarreo. Las instrucciones de corrimiento a la derecha estipulan datos lógicos (sin signo) o aritméticos (con signo):  



Las siguientes instrucciones relacionadas ilustran SHR y datos con signo: 

  INSTRUCCION                  COMENTARIO 
   MOV    CL, 03
   MOV    AL, 10110111B      ; AL = 10110111
   SHR   AL, 01                     ; AL = 01011011      Un corrimiento a la derecha 
   SHR    AL, CL                    ; AL = 00001011     Tres corrimientos adicionales a la derecha 
   
El primer SHR desplaza el contenido de AL un bit hacia la derecha. El bit de mas a la derecha es enviado a la bandera de acarreo, y el bit de mas a la izquierda se
llena con un cero. El segundo SHR desplaza tres bits más a AL. La bandera de acarreo contiene de manera sucesiva 1, 1 y 0; además, tres bits 0 son colocados a la izquierda del AL. 

SAR se difiere de SHR en un punto importante: SAR utiliza el bit de signo para llenar el bit vacante de más a la izquierda. De esta manera, los valores positivos y negativos retienen sus signos. Las siguientes instrucciones relacionadas ilustran SAR y datos con signo en los que el signo es un bit 1:
  
En especial, los corrimientos a la derecha son útiles para (dividir entre 2) obtener mitades de valores y son mucho más rápidas que utilizar una operación de división.  Al terminar una operación de corrimiento, puede utilizar la instrucción JC (Salta si hay acarreo) para examinar el bit desplazado a la bandera de acarreo. 


DESPLAZAMIENTO O CORRIMIENTO DE BITS A LA IZQUIERDA. 

Los corrimientos hacia la izquierda (SHL y SAL) mueven los bits a la izquierda, en el registro designado. SHL y SAL son idénticos en su operación. El bit desplazado fuera del registro ingresa a la bandera de acarreo. Las instrucciones de corrimiento hacia la izquierda estipulan datos lógicos (sin signo) y aritméticos (con signo): 

SHL: Desplazamiento lógico a la izquierda    SAL: Desplazamiento aritmético a la izquierda 






Las siguientes instrucciones relacionadas ilustran SHL para datos sin signo: 
  
   INSTRUCCION                        COMENTARIO 
    MOV    CL, 03 
    MOV    AL, 10110111B            ; AL = 10110111 
    SHL   AL, 01                            ; AL = 01101110    Un corrimiento a la izquierda 
    SHL    AL, CL                           ; AL = 01110000   Tres corrimientos mas 
  
El primer SHL desplaza el contenido de AL un bit hacia la izquierda. El bit de más a la izquierda ahora se encuentra en la bandera de acarreo, y el último bit de la derecha del AL se llena con cero. El segundo SHL desplaza tres bits más a AL. La bandera de acarreo contiene en forma sucesiva 0, 1 y 1, y se llena con tres ceros a la derecha del AL. 

Los corrimientos a la izquierda llenan con cero el bit de mas a la derecha. Como resultado de esto, SHL y SAL don idénticos. Los corrimientos a la izquierda en especial son útiles para duplicar valores y son mucho más rápidos que usar una operación de multiplicación. 

Al terminar una operación de corrimiento, puede utilizar la instrucción JC (Salta si hay acarreo) para examinar el bit que ingreso a la bandera de acarreo. 
ROTACION DE BITS (DESPLAZAMIENTO CIRCULAR)  
Las instrucciones de rotación, que son parte de la capacidad lógica de la computadora, pueden realizar las siguientes acciones:  

1. Hacer referencia a un byte o a una palabra. 
2. Hacer referencia a un registro o a memoria. 
3. Realizar rotación a la derecha o a la izquierda. El bit que es desplazado fuera llena  el espacio vacante en la memoria o registro y también se copia en la bandera de acarreo. 
4. Realizar rotación hasta 8 bits en un byte, 16 bits en una palabra y 32 bits en una palabra doble. 
5. Realizar rotación lógica (sin signo) o aritmética (con signo).

El segundo operando contiene un valor de rotación, el cual es una constante (un valor inmediato) o una referencia al registro CL. Para los procesadores 8088/8086, la constante inmediata solo puede ser 1; un valor de rotación mayor que 1 debe estar contenido en el registro CL. Procesadores posteriores permiten constantes inmediatas hasta el 31. El formato general para la rotación es:
     

  
ROTACIÓN A LA DERECHA DE BITS 
Las rotaciones a la derecha (ROR y RCR) desplazan a la derecha los bits en el registro designado. Las instrucciones de rotación a la derecha estipulan datos lógicos (sin signo) o aritméticos (con signo):



Las siguientes instrucciones relacionadas ilustran ROR: 

INSTRUCCION                      COMENTARIO 
MOV    CL, 03 
MOV    BH, 10110111B          ; BH = 10110111 
ROR    BH, 01                        ; BH = 11011011     Una rotación a la derecha 
ROR    BH, CL                        ; BH = 00001011    Tres rotaciones a la derecha 

El primer ROR desplaza el bit de más a la derecha del BH a la posición vacante de más a la izquierda. La segunda y tercera operaciones ROR realizan la rotación de los tres bits de mas a la derecha. 

RCR provoca que la bandera de acarreo participe en la rotación. Cada bit que se desplaza fuera de la derecha se mueve al CF y el bit del CF se mueve a la posición vacante de la izquierda.

ROTACIÓN A LA IZQUIERDA DE BITS 
Las rotaciones a la izquierda (ROL y RCL) desplazan a la izquierda los bits del registro designado. Las instrucciones de rotación a la izquierda estipulan datos lógicos (sin signo) y aritméticos (con signo):    
   
Las siguientes instrucciones relacionadas ilustran ROL: 

INSTRUCCION                      COMENTARIO 
MOV    CL, 03 
MOV    BL, 10110111B           ; BL = 10110111 
SHR    BL, 01                         ; BL = 11011011     Una rotación a la izquierda 
SHR    BL, CL                         ; BL = 00001011    Tres rotaciones a la izquierda 
  
El primer ROL desplaza el bit de mas a la izquierda del BL a la posición vacante de mas a la derecha. La segunda y tercera operaciones ROL realizan la rotación de los tres bits de mas a la izquierda. 

De manera similar a RCR, RCL también provoca que la bandera de acarreo participe en la rotación. Cada bit que se desplaza fuera por la izquierda se mueve al CF, y el bit del CF se mueve a la posición vacante de la derecha. 

Puede usar la instrucción JC (salta si hay acarreo) para comprobar el bit rotado hacia la CF en el extremo de una operación de rotación. 
  
Tomado de: Tutorial de Lenguaje Ensamblador


2.14 Obtención de una cadena con la representación hexadecimal

La conversión entre numeración binaria y hexadecimal es sencilla. Lo primero que se hace para una conversión de un número binario a hexadecimal es dividirlo en grupos de 4 bits, empezando de derecha a izquierda. En caso de que el último grupo (el que quede más a la izquierda) sea menor de 4 bits se rellenan los faltantes con ceros.  

Tomando como ejemplo el número binario 101011 lo dividimos en grupos de 4 bits y nos queda:  

10; 1011  

Rellenando con ceros el último grupo (el de la izquierda):  

0010; 1011  

después tomamos cada grupo como un número independiente y consideramos su valor en decimal:  

0010 = 2; 1011 = 11  

Pero como no podemos representar este número hexadecimal como 211 porqué sería un error, tenemos que sustituir todos los valores mayores a 9 por su respectiva representación en hexadecimal, con lo que obtenemos:  

2BH (Donde la H representa la base hexadecimal)  

Para convertir un número de hexadecimal a binario solo es necesario invertir estos pasos: se toma el primer dígito hexadecimal y se convierte a binario, y luego el segundo, y así sucesivamente hasta completar el número. 

2.15 Captura y almacenamiento de datos numéricos

Esta representación esta basada en la notación científica, esto es, representar un número en dos partes: su mantisa y su exponente.  

Poniendo como ejemplo el número 1234000, podemos representarlo como 1.123*10^6, en esta última notación el exponente nos indica el número de espacios que hay que mover el espacio hacia la derecha para obtener el resultado original.
  
En caso de que el exponente fuera negativo nos estaría indicando el número de espacios que hay que recorrer el punto decimal hacia la izquierda para obtener el original.  

Proceso de creación de un programa  

Para la creación de un programa es necesario seguir cinco pasos: diseño del algoritmo, codificación del mismo, su traducción a lenguaje máquina, la prueba del programa y la depuración.  

En la etapa de diseño se plantea el problema a resolver y se propone la mejor solución, creando diagramas esquemáticos utilizados para el mejor planteamiento de la solución. 

La codificación del programa consiste en escribir el programa en algún lenguaje de programación; en este caso específico en ensamblador, tomando como base la solución propuesta en el paso anterior.  

La traducción al lenguaje máquina es la creación del programa objeto, esto es, el programa escrito como una secuencia de ceros y unos que pueda ser interpretado por el procesador. 
La prueba del programa consiste en verificar que el programa funcione sin errores, o sea, que haga lo que tiene que hacer. 


2.16 Operaciones básicas sobre archivos de disco

Servicios de la interrupción 16h para manejo del teclado. 

Función 00h. Lee un carácter. Esta función maneja las teclas del teclado de 83 teclas, pero no acepta entrada de las teclas adicionales en el teclado ampliado de 101 teclas. Retorna en al el carácter, ah el código de rastreo si al=0 es una tecla de función extendida. 

Función 01h.  Determina si un carácter esta presente.
Función 02h.  Regresa el estado actual de las teclas shift.
Función 10h.  Lectura de un carácter del teclado.
Función 11h.  Determina si esta presente un carácter.
MOVS. Mueve un byte, palabra o palabra doble desde una localidad en memoria direccionada por SI a otra localidad direccionada por DI. 

LODS. Carga desde una localidad de memoria direccionada por SI un byte en AL, una palabra en AX o una palabra doble en EAX. 

STOS. Almacena el contenido de los registros AL, AX, o EAX en la memoria direccionada por SI.

CMPS. Compara localidades de memoria de un byte, palabra o palabra doble direccionadas por SI, DI. 

SCAS. Compara el contenido de AL, AX o EAX con el contenido de una localidad de memoria direccionada por SI.

CRUD en Android Studio

El día de hoy le vengo a presentar este CRUD ( CREATE,READ,UPDATE,DELETE) hecho en Android Studio junto a mi compañero Israel Vazquez Castil...