Documentos de Académico
Documentos de Profesional
Documentos de Cultura
TRABAJO ESCRITO
ABSTRACT
In this research project we will focus on the assembly language, we will present the general concept of
assembly language, its characteristics and some advantages and disadvantages that the implementation
of this language brings. In particular, we will pay attention to the entire structure of the assembly
program, including registers, instructions, directives, addressing modes, etc. An explanatory study was
carried out where a wide search for information was carried out in order to present in detail everything
that the use of this language brings, in addition to presenting some examples of its implementation, to
facilitate the understanding of this language by of the reader.
INTRODUCCION
Es una realidad que los ordenadores solo entienden el lenguaje binario que se encuentra conformado
por unos y ceros o código máquina para codificar cualquier acción por lo que surgió el lenguaje
ensamblador, el cual se presentó como un sustituto del lenguaje maquina buscando una mayor cercanía
al utilizado por los humanos, este es un lenguaje de bajo nivel que se desarrolló para acelerar la
velocidad de programación y reducir los errores que se presentan al momento de codificar. Se
encuentra íntimamente relacionado con el hardware, especialmente con el microprocesador lo que
resulta ser su mayor virtud porque el código que se genera al programar en ensamblador es bastante
optimo y competente, sin embargo, como este lenguaje es tan dependiente del microprocesador con el
que se esté trabajando, es muy probable que al momento de programar para otro tipo de
microprocesador en ocasiones no será posible debido a que el lenguaje y sus características cambian.
OBJETIVOS
Adquirir una sólida vista del funcionamiento interno de los microprocesadores
Comprender y utilizar eficazmente el entorno de programación en lenguaje ensamblador.
Aprenda sobre registros, instrucciones, modos de direccionamiento y directivas que forman
parte del ensamblador
LENGUAJE ENSAMBLADOR
Inicialmente debemos tratar de definir lo que es el lenguaje ensamblador, conocido como código objeto,
es el lenguaje dominante de las computadoras, construido sobe la base de los valores únicos y ceros, es
utilizado para escribir programas informáticos de bajo nivel y además se presenta como un lenguaje de
representación más directa para cada arquitectura informática especifica de maquina legible para un
programador. Hasta el día de hoy, se usa para programar controladores de dispositivos hardware, a
partir de lo anterior podemos inferir que un ensamblador no es mas que un programa que le permite
leer un archivo de texto escrito de acuerdo con las reglas de sintaxis o el código fuente que contiene
instrucciones, datos y solicitudes de usuarios para solucionar problemas de una computadora.
CARACTERISTICAS
Los programas escritos en lenguaje ensamblador expresan las instrucciones de una manera más natural
al hombre a la vez que muy cercano al microcontrolador dado que el lenguaje ensamblador en sí mismo
es el lenguaje maquina representado por símbolos y palabras, este lenguaje trabaja con mnemónicos
que son un grupo de caracteres alfanuméricos que simbolizan las ordenes o tareas a realizar, lo que
permite que sea más fácil recordarlas, en lugar de usar números binarios como la programación en
lenguaje de maquina puro y cada una de esas sentencias corresponde a la otra en el código máquina,
este lenguaje se programan directamente en el hardware y generalmente son más rápidos y usan menos
recursos del sistema (RAM y ROM) por lo que al tener la capacidad de afectar directamente el hardware
de la CPU, existe una estrecha relación entre el funcionamiento interno del dispositivo y la lógica de
programación, los programas escritos en lenguaje ensamblador se llaman código fuente (*.asm). El
programa ensamblador facilita gracias a este fichero el correspondiente código máquina, que
generalmente tiene la extensión (*.hex).
VENTAJAS
Velocidad: Como este lenguaje trabaja directamente con el microprocesador al ejecutar un
programa es más cercano a la máquina, mucho más compacto y por lo tanto la computadora lo
procesa más rápido.
Tamaño: El uso del lenguaje ensamblador es más útil si se quiere reducir el tamaño del
ejecutable, mejorar el uso de la memoria y obtener beneficios de velocidad. Entre los programas
donde es muy importante minimizar el consumo de memoria se encuentran los virus y los
administradores de dispositivos (drivers). Por supuesto, muchos de ellos están escritos en
lenguaje ensamblador.
Flexibilidad: Es flexible porque todo lo que se puede hacer en una máquina se puede hacer en
lenguaje ensamblador para esa máquina. Los lenguajes de alto nivel están restringidos de una
forma u otra para hacer un uso completo de los recursos de la máquina, los lenguajes
ensambladores no, es decir, en el lenguaje ensamblador puede realizar algunas tareas que los
lenguajes de nivel alto no pueden hacer.
Proporciona un mayor control sobre el hardware de la computadora.
DESVENTAJAS
Tiempo de programación: Dado que es un lenguaje de programación de bajo nivel, requiere un
mayor número de instrucciones para completar el mismo proceso que un lenguaje de alto nivel.
Po lo tanto, requiere más atención por parte del desarrollador ya que introduce errores lógicos
que se reflejan con mayor fuerza y frecuencia durante la ejecución.
Programas fuentes grandes: Del mismo modo, el tiempo se extiende como el programa de
origen, solo necesitamos instrucciones más primitivas para describir un proceso equivalente.
Esto es un inconveniente porque hace que el programa sea más difícil de mantener y, a su vez,
reduce el rendimiento del desarrollador.
Peligro de afectar recursos inesperadamente: Cualquier error que podamos cometer o cualquier
riesgo que podamos correr puede afectar los recursos de la máquina y la situación de
programación más común en este lenguaje es un erro o un reinicio de la máquina. Porque con
este lenguaje es bastante posible y fácil generar cadenas de comandos no validas que
normalmente no ocurrirían cuando se usa un lenguaje de alto nivel.
Falta de portabilidad: Debido a que cada máquina tiene un lenguaje ensamblador, Obviamente,
esta no es la elección de idioma correcta cuando queremos escribir código en una máquina y
luego transferir el programa a otro sistema operativo o modelo de computadora. Aunque este
es un problema común en todos los lenguajes, es más evidente en ensamblador. Si escribimos el
programa en ensamblador del pc, no importa qué tan bien los desarrollemos y nos apeguemos a
los estándares, realmente necesitamos reescribir el 100% del código.
ESTRUCTURA
Un programa en lenguaje ensamblador se encuentra formado por líneas y cada una de estas tiene un
comentario, una instrucción o también puede ser una directiva. El nombre de las instrucciones en
ensamblador está conformado por dos, tres o cuatro letras, a estas instrucciones también se les conoce
como nombres mnemónicos o como códigos de operación, ya que representan ciertas funciones que
debe realizar el procesador.
En lo que sigue se utilizan los símbolos <> para encerrar un identificador o un número que el
programador debe escribir; los símbolos [] encierran elementos opcionales; los símbolos {} encierran
elementos que se pueden escribir de manera consecutiva en varias ocasiones; el carácter | separa
elementos opcionales.
REGISTROS
REGISTROS DE USO GENERAL:
REGISTROS PUNTEROS
REGISTROS DE SEGMENTO
REGISTROS ESPECIALES
Overflow
NV (Apagado): No hay desbordamiento
Direction
UP: Hacia adelante
DN: Hacia atrás
Interrupts
DI: Desactivadas
EI: Activadas
Sign
PL: Positivo
NG: Negativo
Zero
NZ: No es cero
ZR: Si lo es
Auxiliary carry
NA: No hay acarreo auxiliar
AC: Hay acarreo auxiliar
Parity
PO: Impar
PE: Paridad par
Carry
NC: No hay acarreo
CY: Si lo hay
INSTRUCCIONES
Son aquellos nemónicos que son convertidos por el ensamblador en código máquina que puede ejecutar
el núcleo del microcontrolador. En la gama media (PIC16xxx) cada nemónico se convierte en una palabra
en la memoria de programa
ARITMETICAS: Se utiliza para realizar operaciones aritméticas en los operandos que contiene el
lenguaje.
ADC: Adición con acarreo, lleva la suma de dos operandos y suma uno al resultado en caso de
que la bandera CF este activada, esto es, en caso de que exista acarreo, el resultado se guarda
en el operando destino
ADD: agregue un operando y almacene el resultado en el operando de destino
SUB: resta el operando de origen del destino
DIV: Un divisor puede ser un byte o una palabra y es un operando de la instrucción.
IDIV: esto es esencialmente lo mismo que la instrucción DIV, excepto que el siguiente comando
realiza operaciones con símbolos
MUL: El ensamblador asume que el multiplicando es del mismo tamaño que el multiplicador,
entonces si el multiplicador es de 8 bits, multiplica el valor en el registro que se supone que es
un operando por el valor en AH, si el multiplicador es de 16 bits, multiplicar por AX.
IMUL: Este comando hace lo mismo que el MUL, solo que si toma en cuenta los signos de las
cantidades que se multiplican.
SBB: Su propósito es la substaccion con acarreo, esta instrucción resta los operandos y resta uno
al resultado si CF esta activada, el operando siempre se resta del destino, este tipo de
substraccion se utiliza cuando se trabaja con cantidades de 32 bits
AND: use esta instrucción para realizar una operación “y” lógica en dos operandos.
OR: Realiza la disyunción inclusiva lógica bit a bit de los dos operandos.
XOR: Su función es ejecutar bit a bit la disyunción exclusiva lógica de los dos operandos.
TEST: Realiza la concatenación de operadores bit a bit, pero a diferencia de AND, esta
instrucción no pone el resultado en el operando de destino, solo afecta el estado de las
banderas.
NEG: Esta instrucción genera complemento a 2 para el operando de destino y los almacena en
el mismo operando.
NO: Realiza la negación bit a bit del operando de destino.
TRANSFERENCIA: Este tipo de instrucción se utiliza para transportar el contenido del operador y cada
instrucción puede usar un modo de direccionamiento diferente.
MOV: Tiene como propósito la 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.
MOVS: 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.
CARGA: Estas son instrucciones específicas de los registros. Son usadas para cargar en algún registro
bytes o cadenas de bytes.
PILA: Estas instrucciones permiten el uso de la pila para almacenar y extraer datos.
POP: Tiene como propósito recuperar un dato de la pila, Sintaxis: POP destino.
Esta instrucción permite transferir el ultimo valor almacenado en la pila al operando destino,
después 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.
POFF: Su función es extraer las banderas almacenadas en la pila, Sintaxis: POFF, este comando
transfiere bits de la palabra almacenada en la parte superior de la pila hacia el registro de
banderas.
PUSH: El propósito de esta instrucción es colocar 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
PUSHF: Se utiliza para colocar el valor de las banderas en la pila, Sintaxis: PUSHF.
Este comendo 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.
SALTO: Estas instrucciones se caracterizan por el operador contiene una dirección de memoria en la cual
debe continuar la ejecución en el caso que la instrucción así lo determine.
BUCLE: Es muy frecuente que se necesite ejecutar un grupo de instrucciones cierto número de vece, por
ello, la mayoría de las máquinas tienen instrucciones específicas para ello.
INSTRUCCIONES DE BANDERA:
DIRECTIVAS
Son Pseudoinstrucciones que controlan el proceso de ensamblado del programa, son ejecutadas en el
tiempo de ensamblado y no por la CPU en tiempo de ejecución, al no afectar al microprocesador no
generan código objeto, pueden ser utilizadas para reservar áreas de almacenamiento y opcionalmente
para asignar su contenido inicial, además de definir segmentos, símbolos, procedimientos o subrutinas,
reservar memoria, etc.
EQU (EQUivalence): La directiva EQU especifica un nombre simbólico para el valor de una expresión. El
compilador, cuando encuentre en el código dicho nombre simbólico, lo sustituirá por el valor de la
expresión.
DB (Define Byte): La directiva DB reserva memoria para datos de tipo byte (8 bits), o para una variable
de este tipo, inicializando o no dicho byte y los posteriores.
SEGMENT: Esta directiva se utiliza para definir el inicio de un segmento, el nombre de este segmento
debe estar presente, ser único y cumplir las convenciones para nombres del lenguaje.
END: Indica el final de un segmento y debe contener el mismo nombre del enunciado SEGMENT.
ASSUME: Esta directiva tiene como objetivo indicar al ensamblador qué segmento va a direccionar cada
uno de los registros de segmento. Esta directiva sigue, normalmente, a la directiva SEGMENT.
PAGE: Se utiliza para designar el número máximo de líneas para listar en una página y el número
máximo de caracteres por línea.
TITLE: Se utiliza para hacer que se imprima un título en la línea 2 de cada página.
PROC-ENDP: Estas directivas se utiliza para definir el inicio y el final de un procedimiento, que es un
conjunto de sentencias a las que se les puede acceder directamente llamando al procedimiento.
INTERRUPCIONES
Una interrupción es un caso especial que detiene la ejecución del programa para que el sistema pueda
actuar. Esto sucede, por ejemplo, cuando un periférico requiere la atención del procesador para realizar
una operación de E/S.
Las interrupciones son quizás el mecanismo más importante para conectar un microcontrolador al
mundo exterior, sincronizando la ejecución del programa con eventos externos.
MACRO
Una macro es un grupo de instrucciones repetidas en un programa que se codifica una sola vez
y se puede utilizar tantas veces como sea necesario.
La principal diferencia entre una macro y un procedimiento es que en una macro es posible
pasar parámetros mientras que en un procedimiento no. Cuando se ejecuta la macro, cada
parámetro se reemplaza con el nombre o valor especificado cuando se llamó.
Entonces podemos decir que un procedimiento es una extensión de cierto programa, mientras
que una macro es un módulo con funciones específicas que pueden ser utilizadas por otros
programas en conjunto.
Otra diferencia entre macro y procedimiento es como se llama a cada uno, para llamar a un
procedimiento se requiere el uso de una directiva, en cambio la llamada a la macro se ejecuta
como si fuera una instrucción en ensamblador.
La directiva de terminación de una macro es ENDM.
MODOS DE DIRECCIONAMIENTO
El modo de direccionamiento determina cómo interactúan los campos de operandos con los
registros y el procesador. Todas las instrucciones que se refieren a datos, ubicaciones de
memoria, registros o combinaciones de los mismos difieren en sus operadores. Cada una de
estas referencias define cómo se procesan las sentencias y los resultados en el programa.
Modo Registro: Se utilizan únicamente registros como los operadores, no necesita calcular la
Dir. Absoluta. En este modo de direccionamiento se transfiere un byte o palabra desde el
registro fuente o localidad en memoria, hasta el registro o localidad destino en la memoria
ejemplo MOV CX, DX copia el contenido de tamaño de palabra en el registro DX y lo pasa al
registro CX.
Modo Inmediato: Consta de dos operandos, un registro y una constante que se usa por su
valor, este valor constante no se tiene que buscar en memoria ya que se obtuvo al hacer el
“fetch” de la instrucción, por lo que es rápido, pero no más que el modo registro el cual requiere
al BIU por el dato.
Modo Directo: La dirección del operando viene incluida en la instrucción, aquí el procesador
calcula la dirección real, El valor constante se tiene que buscar en memoria, en la localidad
especificada, es más lento que los modos de direccionamiento anteriores sin embargo es el
más veloz para ir a memoria puesto que al saber la dirección y la toma de la instrucción no
tiene que calcularla.
Modo Indirecto: En este modo de direccionamiento el operando se encuentra en memoria y la
instrucción contiene una dirección que se emplea para leer en memoria una dirección
intermedia que será la verdadera dirección del objeto buscado.
Modo Indexado: El procesador es quien calcula la dirección efectiva, el operando se encuentra
en memoria y el registro índice se modifica a menudo en la ejecución del programa.
LINKS
https://carteleras.webcindario.com/asm_ant.pdf
https://es.wikipedia.org/wiki/Lenguaje_ensamblador#Detalles_adicionales
https://www.mat.uson.mx/lcota/Lenguaje%20ensamblador.htm
https://www.ecured.cu/Lenguaje_ensamblador
https://www.monografias.com/trabajos103/introduccion-al-lenguaje-
ensamblador/introduccion-al-lenguaje-ensamblador
https://www.ecured.cu/Lenguaje_ensamblador