martes, 22 de octubre de 2019
Lenguaje Ensamblador NASM
section .text
global _start
_start:
mov eax, [x]
sub eax, '0'
mov ebx, [y]
sub ebx, '0'
add eax, ebx
add eax, '0'
mov [sum], eax
mov ecx, msg
mov edx, len
mov ebx, 1
mov eax, 4
int 0x80
mov ecx, sum
mov edx, 1
mov ebx, 1
mov eax, 4
int 0x80
mov eax, 1
int 0x80
section .data
x db '5'
y db '3'
msg db "sum of x and y is "
len equ $ - msg
segment .bss
sum resb 1
Definición:
Los registros del procesador son una porción de memoria ultrarrápida, se emplean para:
• Controlar instrucciones en ejecución. • Manejar direccionamiento de memoria. • Proporcionar capacidad aritmética.
• Los registros son espacios físicos dentro del microprocesador con capacidad de 4 bits hasta 64 bits dependiendo del microprocesador que se emplee. • Los bits, por conveniencia, se numeran de derecha a izquierda: (15,14,13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0).
Tipos de Registros
Los registros se dividen en:
• • • • • • Registros de segmento. Registro de apuntador de instrucciones. Registros apuntadores. Registros de propósito general. Registros índice. Registro de banderas.
Registros de segmento
Tiene 16 …ver más…
REGISTRO
Registro AX Registro BX Registro CX Registro DX
PROPÓSITO
Acumulador principal Registro base Registro contador Registro de Datos
• Los procesadores 80386 y posteriores permiten el uso de todos registros de propósito general, más sus versiones ampliadas de 32 bits; EAX, EBX, ECX y EDX.
Registros Índice.
Los registros SI y DI están disponibles para direccionamientos indexados y para sumas y restas. Que son la operaciones de punta.
Registros de Índice
REGISTRO PROPÓSITO
El registro índice de 16 bits es requerido por algunas operaciones con cadenas (de caracteres). En este contexto, el SI está asociado con el registro DS. Los procesadores 80386 y posteriores permiten el uso de un registro ampliado a 32 bits, el ESI.
Registro SI
Registro DI
El registro índice destino también es requerido por algunas operaciones con cadenas de caracteres. En este contexto, el Di está asociado con el registro ES. Los procesadores 80386 y posteriores permiten el uso de un registro ampliado a 32 bits, el EDI.
Registros de Banderas.
Sirven para indicar el estado actual de la máquina y el resultado del procesamiento. Las instrucciones que piden comparaciones y aritmética cambian el estado de las banderas, algunas cuyas instrucciones pueden realizar pruebas para determinar la acción siguiente.
Registro AX Registro BX Registro CX Registro DX
PROPÓSITO
Acumulador principal Registro base Registro contador Registro de Datos
• Los procesadores 80386 y posteriores permiten el uso de todos registros de propósito general, más sus versiones ampliadas de 32 bits; EAX, EBX, ECX y EDX.
Registros Índice.
Los registros SI y DI están disponibles para direccionamientos indexados y para sumas y restas. Que son la operaciones de punta.
Registros de Índice
REGISTRO PROPÓSITO
El registro índice de 16 bits es requerido por algunas operaciones con cadenas (de caracteres). En este contexto, el SI está asociado con el registro DS. Los procesadores 80386 y posteriores permiten el uso de un registro ampliado a 32 bits, el ESI.
Registro SI
Registro DI
El registro índice destino también es requerido por algunas operaciones con cadenas de caracteres. En este contexto, el Di está asociado con el registro ES. Los procesadores 80386 y posteriores permiten el uso de un registro ampliado a 32 bits, el EDI.
Registros de Banderas.
Sirven para indicar el estado actual de la máquina y el resultado del procesamiento. Las instrucciones que piden comparaciones y aritmética cambian el estado de las banderas, algunas cuyas instrucciones pueden realizar pruebas para determinar la acción siguiente.
lunes, 21 de octubre de 2019
4.4 Administrador de memoria
La administración de la memoria es un
proceso hoy en día muy importante, de tal modo que su mal o buen uso tiene una
acción directa sobre el desempeño de memoria. En general un ensamblador tiene
un administrador de memoria más limitado que un compilador; en la mayoría de
los lenguajes de programación el uso de punteros no estaba vigilado por lo que
se tienen muchos problemas con el uso de memoria. Los lenguajes más recientes
controlan el uso de punteros y tienen un programa denominado recolector de
basura que se encarga de limpiar la memoria no utilizada mejorando el
desempeño.
La memoria principal puede ser considerada como un
arreglo lineal de localidades de almacenamiento de un byte de tamaño. Cada
localidad de almacenamiento tiene asignada una dirección que la identifica
Se distinguen los siguientes
propósitos del sistema de administración de memoria:
Protección.
Si varios programas comparten
la memoria principal, se
debería asegurar que el
programa no sea capaz de cambiar las ubicaciones no pertenecientica él. Aunque
una acción de escritura puede tener efectos más
graves que una de lectura, esta última tampoco debería estar
permitida, para proporcionar algo de privacidad al programa.
Compartimiento.
Este objetivo parece contradecir al
anterior, sin embargo a veces es necesario para los usuarios poder compartir y
actualizar información (por ejemplo, en una base de datos) y, si se organiza la
tarea de entrada a la misma, se puede evitar el tener varias copias de la
rutina.
Reubicación.
La técnica de multiprogramación
requiere que varios programas ocupen la memoria al mismo tiempo.
Sin embargo no se
sabe con anticipación donde
será cargado cada programa por lo que no es
práctico usar direccionamiento absoluto de memoria.
Organización física.
Debido al costo de una
memoria principal rápida, éste se usa
en conjunto con una memoria secundaria mucho más
lenta (y por consiguiente, barata) a fines de extender su capacidad.
Organización lógica.
Aunque la
mayor parte de las
memorias son organizadas
linealmente con un direccionamiento secuencial,
esto difícilmente concuerde con el camino seguido por el programa, debido al
uso de procedimientos, funciones, subrutinas, arreglos, etc
4.3 Lenguaje Máquina
Es el que proporciona poca o
ninguna abstracción del microprocesador de un ordenador. El lenguaje máquina
solo es entendible por las computadoras. Se basa en una lógica binaria de 0 y
1, generalmente implementada por mecanismos eléctricos. En general el lenguaje
maquina es difícil de entender para los humanos por este motivo hacemos uso de
lenguajes más parecidos a los lenguajes naturales.
Se denomina lenguaje
máquina a la serie de datos que la parte física de la computadora o hardware,
es capaz de interpretar. El lenguaje máquina fue el primero que empleo el
hombre para la programación de las primeras computadoras. Una instrucción en
lenguaje máquina puede representarse de la
siguiente forma: 011011001010010011110110.
Esta secuencia es fácilmente ejecutada por
la computadora, pero es de difícil interpretación, siendo aún más difícil la
interpretación de un programa (conjunto de instrucciones) escrito de esta
forma.
Esta dificultad
hace que los errores
sean frecuentes y la
corrección de los mismos
costosa, cuando no imposible, al igual que la verificación y modificación de
los programas.
Características:
El lenguaje máquina realiza un conjunto
de operaciones predeterminadas llamadas micro operaciones. Las micro
operaciones sólo realizan operaciones del tipo aritmética (+,- ,*,/), lógicas
(AND, OR, NOT) y de control (secuencial, de control y repetitiva). El lenguaje
maquina es dependiente del tipo de arquitectura. Así un programa máquina para
una arquitectura Intel x86 no sé ejecutara en una arquitectura Power PC de IBM
(al menos de manera nativa).
Algunos microprocesadores implementan
mas funcionalidades llamado CISC, pero son más lentos que los RISC ya que estos
tienen registros más grandes.
Ventajas
·
Mayor adaptación al equipo.
·
Máxima velocidad con mínimo uso de memoria.
Desventajas
·
Imposibilidad de escribir código independiente de la máquina.
·
Mayor dificultad en la programación y en la comprensión de los
programas.
·
El programador debe conocer más de un centenar de instrucciones.
·
Es necesario conocer en detalle la arquitectura de la máquina.
4.2 Lenguaje ensamblador
¿Qué es?
El lenguaje Assembly (Urbina,
2011) (a veces mal
llamado "Ensamblador" por
su traducción literal al español) 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 computadora
Segunda generación de lenguajes
Versión simbólica de los lenguajes máquina (Urbina, 2011) (MOV, ADD).La
comunicación en lenguaje de máquina es particular de cada procesador que se
usa, y programar en este lenguaje es muy difícil y tedioso, por lo que se
empezó a buscar mejores medios de comunicación con ésta. Los lenguajes
ensambladores tienen ventajas sobre los lenguajes de máquina.
Este lenguaje fue usado ampliamente en el
pasado para el desarrollo de software, pero actualmente sólo
se utiliza encontradas ocasiones, especialmente
cuando se requiere la manipulación directa
del hardware o se pretenden rendimientos inusuales de los equipos
Características:
El programa lee un archivo escrito en lenguaje ensamblador y sustituye
cada uno de los códigos mnemotécnicos por su equivalente código máquina. Los
programas se hacen fácilmente portables de máquina a máquina y el cálculo de
bifurcaciones se hace de manera fácil.
Clasificación:
·
Ensambladores básicos: Son de muy bajo
nivel, y su tarea consiste básicamente, en ofrecer nombres simbólicos a las
distintas instrucciones, parámetros y cosas tales como los modos de
direccionamiento
·
Ensambladores modulares, o macro ensambladores: Descendientes
de los ensambladores básicos, fueron muy populares en las décadas de los 50 y
los 60, fueron antes de la generalización de los lenguajes de alto nivel. Un
macroinstrucción es el equivalente a una función en un lenguaje de alto nivel.
Operaciones básicas
(Urbina, 2011) Las operaciones básicas en un lenguaje ensamblador son la
suma la resta la multiplicación y la división y Necesitara un poco más de
información sobre la arquitectura y SO para el cual programas.
Pero la idea básica es:
--definir que parámetros tendrá la función.
--hacer el programa, propiamente dicho, en assembler.
Siguiendo la convención de pasaje de parámetros, manejará registros y
posiciones de memoria, devolviendo los resultados en donde deba (una
posición de memoria, el registro eax, etc.).
4.1 Registros
¿Qué son?
Los registros son la memoria
principal de la computadora. Existen diversos registros de propósito general y
otros de uso exclusivo. Algunos registros de propósito general son utilizados
para cierto tipo de funciones. Existen registros acumuladores, puntero de
instrucción, de pila, etc.
Los registros son espacios
físicos dentro del microprocesador con capacidad de 4 bits hasta 64 bits
dependiendo del microprocesador que se emplee.
¿Quiénes lo utilizan?
Antes de nada, para el
desarrollo de esta parte hablaremos indistintamente de registros de activación
o de marcos de pila. Esto se debe a que en la documentación encontrada sobre el
manejo de los registros ebp y esp se hace mención a dicho concepto de marco de
pila. Puesto que el
lenguaje permite recursividad,
los registros de activación
se asignan dinámica mente.
Distribución
La UCP o CPU tiene 14
registros internos, cada uno de ellos de 16 bits (una palabra). Los bits están
enumerados de derecha a izquierda, de tal modo que el bit menos significativo
es el bit 0.
Los registros se pueden
clasificar de la siguiente forma:
Registros de datos:
AX: Registro acumulador. Es el
principal empleado en las operaciones aritméticas.
BX: Registro base. Se usa para
indicar un desplazamiento.
CX: Registro contador. Se usa
como contador en los bucles.
DX: Registro de datos.
Estos registros son de uso
general y también pueden ser utilizados como registros de 8 bits, para
utilizarlos como tales es necesario referirse a ellos como por ejemplo: AH y
AL, que son los bytes alto (high) y bajo (low) del registro AX. Esta
nomenclatura es aplicable también a los registros BX, CX y DX.
Registros de segmentos:
CS: Registro de segmento de
código. Contiene la dirección de las instrucciones del programa.
DS: Registro segmento de
datos. Contiene la dirección del área de memoria donde se encuentran los datos
del programa.
SS: Registro segmento de pila.
Contiene la dirección del segmento de pila. La pila es un espacio de memoria
temporal que se usa para almacenar valores de 16 bits (palabras).
ES: Registro segmento extra.
Contiene la dirección del segmento extra. Se trata de un segmento de datos
adicional que se utiliza para superar la limitación de los 64Kb del segmento de
datos y para hacer transferencias de datos entre segmentos.
Registros punteros de pila:
SP: Puntero de la pila.
Contiene la dirección relativa al segmento de la pila.
BP: Puntero base. Se utiliza
para fijar el puntero de pila y así poder acceder a los elementos de la pila.
Registros índices:
SI: Índice fuente.
DI: Índice destino.
¿Cuales su aplicación en la
generación de códigos?
1. usar el registro de y si
está en un registro que no tiene otra variable, y además y no
está viva ni tiene uso
posterior. Si no:
2. usar un registro vacío si
hay. Si no:
3. usar un registro ocupado si
op requiere que x esté en un registro o si x tiene uso
Posterior. Actualizar el
descriptor de registro. Si no:
4. usar la posición de memoria
de x
4 Generación de código objeto
El generador de código
objeto como lo menciona (Urbina, 2011) transforma el código Intermedio
optimizado en código objeto de bajo nivel. Toma código intermedio y genera
Código objeto para la máquina considerada Es la parte más próxima a la arquitectura
de la Máquina. Habitualmente, se escriben ``a mano´´ desarrollo a medida´ para
cada máquina Específica.
3.2.3 Herramientas para el análisis del flujo de datos
•
Existen algunas herramientas que permiten el análisis de los flujos de datos,
entre ellas tenemos los depuradores y desambladores.
• La
optimización al igual que la programación es un arte y no se ha podido
sistematizar del todo.
3.2.2 Criterios para mejorar el código.
• La mejor manera de optimizar
el código es hacer ver a los programadores que optimicen su código desde el
inicio, el problema radica en que el costo podría ser muy grande ya que tendría
que codificar más y/o hacer su código mas legible.
• Los criterios de
optimización siempre están definidos por el compilador
Criterios de
optimización
• Muchos de estos criterios
pueden modificarse con directivas del compilador desde el código o de manera
externa.
• Este proceso lo realizan
algunas herramientas del sistema como los ofuscadores para código móvil y
código para dispositivos móviles.
3.2.1 Costo de ejecución. (memoria, registros, pilas).
• Los costos de
ejecución son aquellos que vienen implícitos al ejecutar el programa.
• En algunos programas
se tiene un mínimo para ejecutar el programa, por lo que el espacio y la
velocidad del microprocesadores son elementos que se deben optimizar para tener
un mercado potencial más amplio. Costos de ejecución
• Las aplicaciones multimedias
como los videojuegos tienen un costo de ejecución alto por lo cual la
optimización de su desempeño es crítico, la gran mayoría de las veces requieren
de procesadores rápidos (e.g. tarjetas de video) o de mucha memoria.
• Otro tipo de
aplicaciones que deben optimizarse son las aplicacione spara dispositivos
móviles. Costos de ejecución
• Los dispositivos
móviles tiene recursos más limitados que un dispositivo de cómputo convencional
razón por la cual, el mejor uso de memoria y otros recursos de hardware tiene
mayor rendimiento.
• En algunos casos es
preferible tener la lógica del negocio más fuerte en otros dispositivos y hacer
uso de arquitecturas descentralizadas como cliente/servidor o P2P.
3.2 Costos.
Los costos son el factor más
importante a tomar en cuenta a la hora de optimizar ya que en ocasiones la
mejora obtenida puede verse no reflejada en el programa final pero si ser
perjudicial para el equipo de desarrollo.
• La optimización de una
pequeña mejora tal vez tenga una pequeña ganancia en tiempo o en espacio pero
sale muy costosa en tiempo en generarla.
Costos
Costos
• Pero en cambio si esa
optimización se hace por ejemplo en un ciclo, la mejora obtenida puede ser N
veces mayor por lo cual el costo se minimiza y es benéfico la mejora.
• Por ejemplo: for(int
i=0; i < 10000; i++); si la ganancia es de 30 ms 300s 7.2.1 Costo de
ejecución.
Suscribirse a:
Entradas (Atom)