Definición
Consiste en un conjunto de mnemónicos que representan
instrucciones básicas para los computadores, microprocesadores,
microcontroladores y otros circuitos integrados programables. Implementa una
representación simbólica de los códigos de máquina binarios y otras constantes
necesarias para programar una arquitectura de procesador y constituye la
representación más directa del código máquina específico para cada arquitectura
legible por un programador. Cada arquitectura de procesador tiene su propio
lenguaje ensamblador que usualmente es definida por el fabricante de hardware,
y está basada en los mnemónicos que simbolizan los pasos de procesamiento (las
instrucciones), los registros del procesador, las posiciones de memoria y otras
características del lenguaje.
Un lenguaje ensamblador es por lo tanto específico de
cierta arquitectura de computador física (o virtual). Esto está en contraste
con la mayoría de los lenguajes de programación de alto nivel, que idealmente
son portátiles.
Características:
·
El código escrito en lenguaje ensamblador posee
una cierta dificultad de ser entendido ya que su estructura se acerca al
lenguaje máquina, es decir, es un lenguaje de bajo nivel.
·
El lenguaje ensamblador es difícilmente
portable, es decir, un código escrito para un microprocesador, puede necesitar
ser modificado, para poder ser usado en otra máquina distinta. Al cambiar a una
máquina con arquitectura diferente, generalmente es necesario reescribirlo
completamente.
·
Los programas hechos por un programador experto
en lenguaje ensamblador son generalmente mucho más rápidos y consumen menos
recursos del sistema (memoria RAM y ROM) que el programa equivalente compilado
desde un lenguaje de alto nivel. Al programar cuidadosamente en lenguaje
ensamblador se pueden crear programas que se ejecutan más rápidamente y ocupan
menos espacio que con lenguajes de alto nivel.
·
Con el lenguaje ensamblador se tiene un control
muy preciso de las tareas realizadas por un microprocesador por lo que se
pueden crear segmentos de código difíciles y/o muy ineficientes de programar en
un lenguaje de alto nivel, ya que, entre otras cosas, en el lenguaje
ensamblador se dispone de instrucciones del CPU que generalmente no están
disponibles en los lenguajes de alto nivel.
·
También se puede controlar el tiempo en que
tarda una rutina en ejecutarse, e impedir que se interrumpa durante su
ejecución.
Ventajas:
·
Velocidad. - Como trabaja directamente con el
microprocesador al ejecutar un programa, pues como este lenguaje es el más
cercano a la máquina la computadora lo procesa más rápido.
·
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.
·
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 específicas que en un lenguaje de alto nivel
no se pueden llevar acabo porque tienen ciertas limitantes que no se lo
permiten.
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 máquina, programar en este lenguaje lo más común que
pueda pasar es que la máquina se bloquee o se reinicialice. 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.
Instrucciones:
Instrucciones de transferencia Son utilizadas para mover
los contenidos de los operandos. Cada instrucción se puede usar con diferentes
modos de direccionamiento.
MOV
MOVS (MOVSB) (MOVSW)
Instrucciones de carga Son instrucciones específicas de los
registros. Son usadas para cargar en algún registro bytes o cadenas de bytes.
LODS (LODSB) (LODSW)
LAHF
LDS
LEA
LES
Instrucciones de la pila Estas instrucciones permiten el
uso de la pila para almacenar y extraer datos.
POP
POPF
PUSH
PUSHF
Instrucción
MOV
Propósito: Transferencia de datos entre celdas de memoria,
registros y acumulador.
Sintaxis:
MOV Destino, Fuente
Donde Destino es el lugar a donde se moverán los datos y
fuente es el lugar donde se encuentran dichos datos.
Los diferentes movimientos de datos permitidos para esta
instrucción son:
Destino: memoria. Fuente: acumulador
Destino: acumulador. Fuente: memoria
Destino: registro de segmento. Fuente: memoria/registro
Destino: memoria/registro. Fuente: registro de segmento
Destino: registro. Fuente: registro
Destino: registro. Fuente: memoria
Destino: memoria. Fuente: registro
Destino: registro. Fuente: dato inmediato
Destino: memoria. Fuente: dato inmediato
Ejemplo:
MOV AX,0006h
MOV BX, AX
MOV AX,4C00h
INT 21H
Este pequeño programa mueve el valor 0006H al registro AX,
luego mueve el contenido de AX (0006h) al registro BX, por último, mueve el
valor 4C00h al registro AX para terminar la ejecución con la opción 4C de la
interrupción 21h.
Instrucción
MOVS (MOVSB) (MOVSW)
Propósito: Mover 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. La secuencia de instrucciones siguiente ilustran esto:
MOV SI, OFFSET VAR1
MOV DI, OFFSET VAR2
MOVS
Primero inicializamos los valores de SI y DI con las
direcciones de las variables VAR1 y VAR2 respectivamente, después al ejecutar
MOVS se copia el contenido de VAR1 a VAR2.
Los comandos MOVSB y MOVSW se utilizan de la misma forma
que MOVS, el primero mueve un byte y el segundo una palabra.
Instrucción LODS (LODSB) (LODSW)
Propósito: Cargar cadenas de un byte o palabra al
acumulador.
Sintaxis:
LODS
Esta instrucción 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
(según el estado de DF) a SI si la transferencia es de bytes o 2 si la
transferencia es de palabras.
MOV SI, OFFSET VAR1
LODS
La primera línea carga la dirección de VAR1 en SI y la
segunda línea 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).
Instrucción LAHF
Propósito: Transfiere al registro AH el contenido de las
banderas
Sintaxis:
LAHF
Esta instrucción es útil para verificar el estado de las
banderas durante la ejecución de nuestro programa.
Las banderas quedan en el siguiente orden dentro del
registro:
SF ZF ¿? AF ¿? PF ¿? CF
El símbolo "¿?" significa que en esos bits habrá.
un valor indefinido.
Instrucción
LDS
Propósito: Cargar el registro del segmento de datos
Sintaxis:
LDS destino, fuente
El operando fuente debe ser una palabra doble en memoria.
La palabra asociada con la dirección más grande es transferida a DS, o sea que
se toma como la dirección del segmento. La palabra asociada con la dirección
menor es la dirección del desplazamiento y se deposita en el registro señalado
como destino.
Instrucción
LEA
Propósito: 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.
Para ilustrar una de las facilidades que tenemos con este
comando pongamos una equivalencia:
MOV SI, OFFSET VAR1
Equivale a:
LEA SI, VAR1
Es muy probable que para el programador sea más sencillo
crear programas extensos utilizando este último formato.
Instrucción
LES
Propósito: Carga el registro del segmento extra
Sintaxis:
LES destino, fuente
El operando fuente debe ser un operando en memoria de
palabra doble. El contenido de la palabra con la dirección mayor se interpreta
como la dirección del segmento y se coloca en ES. La palabra con la dirección
menor es la dirección del desplazamiento y se coloca en el registro
especificado en el parámetro destino.
Instrucción
POP
Propósito: Recupera un dato de la pila
Sintaxis:
POP destino
Esta instrucción transfiere el último valor almacenado en
la pila al operando destino, despues incrementa en dos el registro SP. Este
incremento se debe a que la pila va creciendo desde la dirección más alta de
memoria del segmento hacia la más baja, y la pila solo trabaja con palabras (2
bytes), entonces al incrementar en dos el registro SP realmente se le está
restando dos al tamaño real de la pila.
Instrucción
POPF
Propósito: Extrae las banderas almacenadas en la pila.
Sintaxis:
POPF
Este comando 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.
Instrucción
PUSH
Propósito: 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.
Instrucción
PUSHF
Propósito: Coloca el valor de las banderas en la pila
Sintaxis:
PUSHF
Este comando 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.
Registros:
Los registros del procesador se emplean para controlar
instrucciones en ejecución, manejar direccionamiento de memoria y proporcionar
capacidad aritmética. Los registros son direccionables por medio de un nombre.
Los bits por convención, se numeran de derecha a izquierda, como en:
Los registros internos del procesador se pueden clasificar
en 6 tipos diferentes.
1.Registros de segmento: Estos registros permiten
direccionar la memoria. Los registros de segmento se utilizan para referenciar
áreas de memoria. La plataforma IA-32 permite direccionar la memoria según el
modelo de memoria lineal o el modelo de memoria segmentada. El modelo de
memoria lineal presenta todo el espacio de direcciones de la memoria como un
espacio contiguo. Todas las instrucciones, los datos y la pila se encuentran en
el mismo espacio de direcciones de memoria. Cada posición de memoria se
referencia mediante una dirección específica llamada "dirección lineal".
2.Registros de propósito general: Almacenan datos y están
disponibles para ser usados por el programador. Los registros de propósito
general se utilizan para almacenar datos temporalmente. Debido a que estos
registros han evolucionado desde una máquina de 8 bits (el 8080) un grupo de
registros aún se puede utilizar con un tamaño de 8 bits para mantener
compatibilidad con toda la línea de procesadores.
3.Registros de apuntadores: Los registros SP (apuntador de
la pila) Y BP (apuntador de base) están asociados con el registro SS y permiten
al sistema accesar datos en el segmento de la pila. Registro SP. El apuntador
de la pila de 16 bits está asociado con el registro SS y proporciona un valor
de desplazamiento que se refiere a la palabra actual que está siendo procesada
en la pila. Los procesadores 80386 y posteriores tienen un apuntador de pila de
32 bits, el registro ESP. El sistema maneja de forma automática estos
registros.
4.Registros de banderas: De los 16 bits del registro de
banderas, nueve son comunes a toda la familia de procesadores 8086, y sirven
para indicar el estado actual de la máquina y el resultado del procesamiento.
Muchas instrucciones que piden comparaciones y aritmética cambian el estado de
las banderas, algunas cuyas instrucciones pueden realizar pruebas para
determinar la acción subsecuente. Las banderas más importantes para la
programación en ensamblador son O, S, Z y C, para operaciones de comparación y
aritméticas, y D para operaciones de cadenas de caracteres. Los procesadores 80286
y posteriores tienen algunas banderas usadas para propósitos internos, en
especial las que afectan al modo protegido. Los procesadores 80286 y
posteriores tienen un registro extendido de banderas conocido como Eflags.
5.Registros de Puntero de instrucción: El registro
apuntador de instrucción (eip) o contador de programa contiene la dirección de
la próxima instrucción a ejecutarse.
6.Registros de Pila: La pila es un área de memoria
importante y por ello tiene, en vez de uno, dos registros que se usan como
desplazamiento (offset) para apuntar a su contenido. Se usan como complemento
al registro y son:
-SP- Stack Pointer: Se traduce como puntero de pila y es el
que se reserva el procesador para uso propio en instrucciones de manipulado de
pila. Por lo general, el programador no debe alterar su contenido.
-BP- Base pointer: Se usa como registro auxiliar. El
programador puede usarlo para su provecho.
Ejemplos:
;Programa HOLA MUNDO
DATOS SEGMENT
MENSAJE DB "HOLA MUNDO$"
DATOS ENDS
PILA SEGMENT STACK
"STACK"
DB 200 DUP(0)
PILA ENDS
CODIGO SEGMENT
ASSUME CS:CODIGO,DSATOS,SSILA
PRINCIPAL PROC
MOV AX,DATOS
MOV DS,AX
MOV AH,9
MOV DX,OFFSET MENSAJE
INT 21H
MOV AH,4CH
INT 21H
PRINCIPAL ENDP
CODIGO ENDS
END PRINCIPAL
RESUMEN:
A los programas que permiten pasar del programa escrito con
instrucciones simbólicas del lenguaje maquina (programa fuente, en ensamblador)
al lenguaje máquina también se les denomina normalmente ensambladores. Un
programa escrito en el lenguaje ensamblador requiere considerablemente menos
memoria y tiempo de ejecución que un programa escrito en los conocidos
lenguajes de alto nivel, como Pascal y C.
SUMMARY:
A pass programs that allow the written program with
symbolic machine language instructions (source program in assembler) into machine
language are also commonly called assemblers. A program written in assembly
language requires considerably less memory and runtime that a program written
in the known high-level languages such as Pascal and C.
Hardware, software.
RECOMENDACIONES:
Diseñar un ensamblador en línea para que reconozca los
tokens en el momento que se edita el programa.
Diseñar un lenguaje de alto nivel que al ser compilado
genere el código de máquina para esta computadora básica.
CONCLUSIONES:
Este lenguaje es creado a base de instrucciones para
intentar sustituir al lenguaje maquina por uno similar utilizado por el hombre.
Una de las cosas importantes es que está ocupado al diseño
de las tarjetas madres, cosa que un programa común no podría hacer.
BIBLIOGRAFIA O LINKOGRAFIA:
https://es.wikipedia.org/wiki/Lenguaje_ensamblador#Caracter.C3.ADsticas
http://www.angelfire.com/ak5/seccion-academica/Ventajas_y_desventajas_del_Lenguaje_Ensamblador.htm
http://learnassembler.com/registro.html
https://lenguajeensambladoryelementos.wordpress.com/2013/04/30/registros/
LENGUAJE
ENSAMBLADOR
Definición
Consiste en un conjunto de mnemónicos que representan
instrucciones básicas para los computadores, microprocesadores,
microcontroladores y otros circuitos integrados programables. Implementa una
representación simbólica de los códigos de máquina binarios y otras constantes
necesarias para programar una arquitectura de procesador y constituye la
representación más directa del código máquina específico para cada arquitectura
legible por un programador. Cada arquitectura de procesador tiene su propio
lenguaje ensamblador que usualmente es definida por el fabricante de hardware,
y está basada en los mnemónicos que simbolizan los pasos de procesamiento (las
instrucciones), los registros del procesador, las posiciones de memoria y otras
características del lenguaje.
Un lenguaje ensamblador es por lo tanto específico de
cierta arquitectura de computador física (o virtual). Esto está en contraste
con la mayoría de los lenguajes de programación de alto nivel, que idealmente
son portátiles.
Características:
·
El código escrito en lenguaje ensamblador posee
una cierta dificultad de ser entendido ya que su estructura se acerca al
lenguaje máquina, es decir, es un lenguaje de bajo nivel.
·
El lenguaje ensamblador es difícilmente
portable, es decir, un código escrito para un microprocesador, puede necesitar
ser modificado, para poder ser usado en otra máquina distinta. Al cambiar a una
máquina con arquitectura diferente, generalmente es necesario reescribirlo
completamente.
·
Los programas hechos por un programador experto
en lenguaje ensamblador son generalmente mucho más rápidos y consumen menos
recursos del sistema (memoria RAM y ROM) que el programa equivalente compilado
desde un lenguaje de alto nivel. Al programar cuidadosamente en lenguaje
ensamblador se pueden crear programas que se ejecutan más rápidamente y ocupan
menos espacio que con lenguajes de alto nivel.
·
Con el lenguaje ensamblador se tiene un control
muy preciso de las tareas realizadas por un microprocesador por lo que se
pueden crear segmentos de código difíciles y/o muy ineficientes de programar en
un lenguaje de alto nivel, ya que, entre otras cosas, en el lenguaje
ensamblador se dispone de instrucciones del CPU que generalmente no están
disponibles en los lenguajes de alto nivel.
·
También se puede controlar el tiempo en que
tarda una rutina en ejecutarse, e impedir que se interrumpa durante su
ejecución.
Ventajas:
·
Velocidad. - Como trabaja directamente con el
microprocesador al ejecutar un programa, pues como este lenguaje es el más
cercano a la máquina la computadora lo procesa más rápido.
·
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.
·
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 específicas que en un lenguaje de alto nivel
no se pueden llevar acabo porque tienen ciertas limitantes que no se lo
permiten.
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 máquina, programar en este lenguaje lo más común que
pueda pasar es que la máquina se bloquee o se reinicialice. 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.
Instrucciones:
Instrucciones de transferencia Son utilizadas para mover
los contenidos de los operandos. Cada instrucción se puede usar con diferentes
modos de direccionamiento.
MOV
MOVS (MOVSB) (MOVSW)
Instrucciones de carga Son instrucciones específicas de los
registros. Son usadas para cargar en algún registro bytes o cadenas de bytes.
LODS (LODSB) (LODSW)
LAHF
LDS
LEA
LES
Instrucciones de la pila Estas instrucciones permiten el
uso de la pila para almacenar y extraer datos.
POP
POPF
PUSH
PUSHF
Instrucción
MOV
Propósito: Transferencia de datos entre celdas de memoria,
registros y acumulador.
Sintaxis:
MOV Destino, Fuente
Donde Destino es el lugar a donde se moverán los datos y
fuente es el lugar donde se encuentran dichos datos.
Los diferentes movimientos de datos permitidos para esta
instrucción son:
Destino: memoria. Fuente: acumulador
Destino: acumulador. Fuente: memoria
Destino: registro de segmento. Fuente: memoria/registro
Destino: memoria/registro. Fuente: registro de segmento
Destino: registro. Fuente: registro
Destino: registro. Fuente: memoria
Destino: memoria. Fuente: registro
Destino: registro. Fuente: dato inmediato
Destino: memoria. Fuente: dato inmediato
Ejemplo:
MOV AX,0006h
MOV BX, AX
MOV AX,4C00h
INT 21H
Este pequeño programa mueve el valor 0006H al registro AX,
luego mueve el contenido de AX (0006h) al registro BX, por último, mueve el
valor 4C00h al registro AX para terminar la ejecución con la opción 4C de la
interrupción 21h.
Instrucción
MOVS (MOVSB) (MOVSW)
Propósito: Mover 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. La secuencia de instrucciones siguiente ilustran esto:
MOV SI, OFFSET VAR1
MOV DI, OFFSET VAR2
MOVS
Primero inicializamos los valores de SI y DI con las
direcciones de las variables VAR1 y VAR2 respectivamente, después al ejecutar
MOVS se copia el contenido de VAR1 a VAR2.
Los comandos MOVSB y MOVSW se utilizan de la misma forma
que MOVS, el primero mueve un byte y el segundo una palabra.
Instrucción LODS (LODSB) (LODSW)
Propósito: Cargar cadenas de un byte o palabra al
acumulador.
Sintaxis:
LODS
Esta instrucción 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
(según el estado de DF) a SI si la transferencia es de bytes o 2 si la
transferencia es de palabras.
MOV SI, OFFSET VAR1
LODS
La primera línea carga la dirección de VAR1 en SI y la
segunda línea 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).
Instrucción LAHF
Propósito: Transfiere al registro AH el contenido de las
banderas
Sintaxis:
LAHF
Esta instrucción es útil para verificar el estado de las
banderas durante la ejecución de nuestro programa.
Las banderas quedan en el siguiente orden dentro del
registro:
SF ZF ¿? AF ¿? PF ¿? CF
El símbolo "¿?" significa que en esos bits habrá.
un valor indefinido.
Instrucción
LDS
Propósito: Cargar el registro del segmento de datos
Sintaxis:
LDS destino, fuente
El operando fuente debe ser una palabra doble en memoria.
La palabra asociada con la dirección más grande es transferida a DS, o sea que
se toma como la dirección del segmento. La palabra asociada con la dirección
menor es la dirección del desplazamiento y se deposita en el registro señalado
como destino.
Instrucción
LEA
Propósito: 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.
Para ilustrar una de las facilidades que tenemos con este
comando pongamos una equivalencia:
MOV SI, OFFSET VAR1
Equivale a:
LEA SI, VAR1
Es muy probable que para el programador sea más sencillo
crear programas extensos utilizando este último formato.
Instrucción
LES
Propósito: Carga el registro del segmento extra
Sintaxis:
LES destino, fuente
El operando fuente debe ser un operando en memoria de
palabra doble. El contenido de la palabra con la dirección mayor se interpreta
como la dirección del segmento y se coloca en ES. La palabra con la dirección
menor es la dirección del desplazamiento y se coloca en el registro
especificado en el parámetro destino.
Instrucción
POP
Propósito: Recupera un dato de la pila
Sintaxis:
POP destino
Esta instrucción transfiere el último valor almacenado en
la pila al operando destino, despues incrementa en dos el registro SP. Este
incremento se debe a que la pila va creciendo desde la dirección más alta de
memoria del segmento hacia la más baja, y la pila solo trabaja con palabras (2
bytes), entonces al incrementar en dos el registro SP realmente se le está
restando dos al tamaño real de la pila.
Instrucción
POPF
Propósito: Extrae las banderas almacenadas en la pila.
Sintaxis:
POPF
Este comando 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.
Instrucción
PUSH
Propósito: 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.
Instrucción
PUSHF
Propósito: Coloca el valor de las banderas en la pila
Sintaxis:
PUSHF
Este comando 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.
Registros:
Los registros del procesador se emplean para controlar
instrucciones en ejecución, manejar direccionamiento de memoria y proporcionar
capacidad aritmética. Los registros son direccionables por medio de un nombre.
Los bits por convención, se numeran de derecha a izquierda, como en:
Los registros internos del procesador se pueden clasificar
en 6 tipos diferentes.
1.Registros de segmento: Estos registros permiten
direccionar la memoria. Los registros de segmento se utilizan para referenciar
áreas de memoria. La plataforma IA-32 permite direccionar la memoria según el
modelo de memoria lineal o el modelo de memoria segmentada. El modelo de
memoria lineal presenta todo el espacio de direcciones de la memoria como un
espacio contiguo. Todas las instrucciones, los datos y la pila se encuentran en
el mismo espacio de direcciones de memoria. Cada posición de memoria se
referencia mediante una dirección específica llamada "dirección lineal".
2.Registros de propósito general: Almacenan datos y están
disponibles para ser usados por el programador. Los registros de propósito
general se utilizan para almacenar datos temporalmente. Debido a que estos
registros han evolucionado desde una máquina de 8 bits (el 8080) un grupo de
registros aún se puede utilizar con un tamaño de 8 bits para mantener
compatibilidad con toda la línea de procesadores.
3.Registros de apuntadores: Los registros SP (apuntador de
la pila) Y BP (apuntador de base) están asociados con el registro SS y permiten
al sistema accesar datos en el segmento de la pila. Registro SP. El apuntador
de la pila de 16 bits está asociado con el registro SS y proporciona un valor
de desplazamiento que se refiere a la palabra actual que está siendo procesada
en la pila. Los procesadores 80386 y posteriores tienen un apuntador de pila de
32 bits, el registro ESP. El sistema maneja de forma automática estos
registros.
4.Registros de banderas: De los 16 bits del registro de
banderas, nueve son comunes a toda la familia de procesadores 8086, y sirven
para indicar el estado actual de la máquina y el resultado del procesamiento.
Muchas instrucciones que piden comparaciones y aritmética cambian el estado de
las banderas, algunas cuyas instrucciones pueden realizar pruebas para
determinar la acción subsecuente. Las banderas más importantes para la
programación en ensamblador son O, S, Z y C, para operaciones de comparación y
aritméticas, y D para operaciones de cadenas de caracteres. Los procesadores 80286
y posteriores tienen algunas banderas usadas para propósitos internos, en
especial las que afectan al modo protegido. Los procesadores 80286 y
posteriores tienen un registro extendido de banderas conocido como Eflags.
5.Registros de Puntero de instrucción: El registro
apuntador de instrucción (eip) o contador de programa contiene la dirección de
la próxima instrucción a ejecutarse.
6.Registros de Pila: La pila es un área de memoria
importante y por ello tiene, en vez de uno, dos registros que se usan como
desplazamiento (offset) para apuntar a su contenido. Se usan como complemento
al registro y son:
-SP- Stack Pointer: Se traduce como puntero de pila y es el
que se reserva el procesador para uso propio en instrucciones de manipulado de
pila. Por lo general, el programador no debe alterar su contenido.
-BP- Base pointer: Se usa como registro auxiliar. El
programador puede usarlo para su provecho.
Ejemplos:
;Programa HOLA MUNDO
DATOS SEGMENT
MENSAJE DB "HOLA MUNDO$"
DATOS ENDS
PILA SEGMENT STACK
"STACK"
DB 200 DUP(0)
PILA ENDS
CODIGO SEGMENT
ASSUME CS:CODIGO,DSATOS,SSILA
PRINCIPAL PROC
MOV AX,DATOS
MOV DS,AX
MOV AH,9
MOV DX,OFFSET MENSAJE
INT 21H
MOV AH,4CH
INT 21H
PRINCIPAL ENDP
CODIGO ENDS
END PRINCIPAL
RESUMEN:
A los programas que permiten pasar del programa escrito con
instrucciones simbólicas del lenguaje maquina (programa fuente, en ensamblador)
al lenguaje máquina también se les denomina normalmente ensambladores. Un
programa escrito en el lenguaje ensamblador requiere considerablemente menos
memoria y tiempo de ejecución que un programa escrito en los conocidos
lenguajes de alto nivel, como Pascal y C.
SUMMARY:
A pass programs that allow the written program with
symbolic machine language instructions (source program in assembler) into machine
language are also commonly called assemblers. A program written in assembly
language requires considerably less memory and runtime that a program written
in the known high-level languages such as Pascal and C.
Hardware, software.
RECOMENDACIONES:
Diseñar un ensamblador en línea para que reconozca los
tokens en el momento que se edita el programa.
Diseñar un lenguaje de alto nivel que al ser compilado
genere el código de máquina para esta computadora básica.
CONCLUSIONES:
Este lenguaje es creado a base de instrucciones para
intentar sustituir al lenguaje maquina por uno similar utilizado por el hombre.
Una de las cosas importantes es que está ocupado al diseño
de las tarjetas madres, cosa que un programa común no podría hacer.
BIBLIOGRAFIA O LINKOGRAFIA:
https://es.wikipedia.org/wiki/Lenguaje_ensamblador#Caracter.C3.ADsticas
http://www.angelfire.com/ak5/seccion-academica/Ventajas_y_desventajas_del_Lenguaje_Ensamblador.htm
http://learnassembler.com/registro.html
https://lenguajeensambladoryelementos.wordpress.com/2013/04/30/registros/
DIAPOSITIVA