You are on page 1of 23

Tecnológico​ ​Nacional​ ​de​ ​México

Instituto​ ​Tecnológico​ ​de​ ​Villahermosa

Carrera:
Ingeniería​ ​en​ ​Sistemas​ ​Computacionales

Materia:
Lenguaje​ ​de​ ​Interfaz

Unidad​ ​01​ ​Introducción​ ​al​ ​lenguaje​ ​ensamblador

Docente:
ISC​ ​Antonio​ ​Priego​ ​Clemente

Integrantes​ ​del​ ​Equipo:


Javier​ ​Damián​ ​Hernández​ ​Castillo
Luis​ ​Alonso​ ​Ruíz​ ​López
Miguel​ ​González​ ​Galindo
Alejandro​ ​Flores​ ​Ulin
Índice:

1.1​ ​Importancia​ ​de​ ​la​ ​programación​ ​en​ ​lenguaje​ ​ensamblador.


1.2​ ​El​ ​procesador​ ​y​ ​sus​ ​registros​ ​internos
1.3​ ​La​ ​memoria​ ​principal​ ​(RAM)
1.4​ ​El​ ​concepto​ ​de​ ​interrupciones
1.5​ ​Llamadas​ ​a​ ​servicios​ ​del​ ​sistema
1.6​ ​Modos​ ​de​ ​direccionamiento
1.7​ ​Proceso​ ​de​ ​ensamblado​ ​y​ ​ligado
1.8​ ​Desplegado​ ​de​ ​mensajes​ ​en​ ​el​ ​monitor

1
Introducción:
La importancia del lenguaje ensamblador es principalmente que se trabaja
directamente con el microprocesador; por lo cual se debe de conocer el funcionamiento
interno de este, tiene la ventaja de que se puede realizar cualquier tipo de programas
que en los lenguajes de alto nivel no lo pueden realizar. Otro punto sería que los
programas​ ​en​ ​ensamblador​ ​ocupan​ ​menos​ ​espacio​ ​en​ ​memoria.
Aunque la mayoría de los especialistas en Software desarrolla aplicaciones en
lenguajes de alto nivel, que son más fáciles de escribir y de dar mantenimiento, una
práctica común es re codificar en lenguaje ensamblador aquellas rutinas que han
causado​ ​cuellos​ ​de​ ​botella​ ​en​ ​el​ ​procesamiento.

El lenguaje ensamblador es la primera abstracción del lenguaje de máquina, consiste


en asociar a los códigos de operación (OPCODES) palabras clave que faciliten el uso
por​ ​parte​ ​del​ ​programador

2
1.1​ ​Importancia​ ​de​ ​la​ ​programación​ ​en​ ​lenguaje​ ​ensamblador
El lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para escribir
programas informáticos, y constituye la representación más directa del código máquina
específico​ ​para​ ​cada​ ​arquitectura​ ​de​ ​microprocesador.

Importancia

La importancia del lenguaje ensamblador es principalmente que se trabaja


directamente con el microprocesador; por lo cual se debe de conocer el funcionamiento
interno de este, tiene la ventaja de que en el se puede realizar cualquier tipo de
programas​ ​que​ ​en​ ​los​ ​lenguajes​ ​de​ ​alto​ ​nivel​ ​no​ ​lo​ ​pueden​ ​realizar.

Otro punto sería que los programas en ensamblador ocupan menos espacio en
memoria.

Características

El lenguaje ensamblador es el único lenguaje que entienden los microcontroladores es


el​ ​código​ ​máquina​ ​formado​ ​por​ ​ceros​ ​y​ ​unos​ ​del​ ​sistema​ ​binario.

El lenguaje ensamblador expresa las instrucciones de una forma más natural al hombre
a la vez que muy cercana al microcontrolador, ya que cada una de esas instrucciones
se​ ​corresponde​ ​con​ ​otra​ ​en​ ​código​ ​máquina.

El único lenguaje que entienden los microcontroladores es el código máquina formado


por​ ​ceros​ ​y​ ​unos​ ​del​ ​sistema​ ​binario.

El lenguaje ensamblador expresa las instrucciones de una forma más natural al hombre
a la vez que muy cercana al microcontrolador, ya que cada una de esas instrucciones
se​ ​corresponde​ ​con​ ​otra​ ​en​ ​código​ ​máquina.

El lenguaje ensamblador trabaja con nemónicos, que son grupos de caracteres


alfanuméricos​ ​que​ ​simbolizan​ ​las​ ​órdenes​ ​o​ ​tareas​ ​a​ ​realizar.

La traducción de los nemónicos a código máquina entendible por el microcontrolador la


lleva​ ​a​ ​cabo​ ​un​ ​programa​ ​ensamblador.

El​ ​programa​ ​escrito​ ​en​ ​lenguaje​ ​ensamblador​ ​se​ ​denomina​ ​código​ ​fuente​ ​(*.asm).

El programa ensamblador proporciona a partir de este fichero el correspondiente


código​ ​máquina,​ ​que​ ​suele​ ​tener​ ​la​ ​extensión​ ​*.hex.

3
Ventajas

01. 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.
02. 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.
03. Flexibilidad .- Es flexible porque todo lo que puede hacerse con una máquina,
puede​ ​hacerse​ ​en​ ​el​ ​lenguaje​ ​ensamblador​ ​de​ ​esta​ ​máquina.

Desventajas

01. 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.
02. 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.
03. 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.
04. 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.

4
1.2​ ​El​ ​procesador​ ​y​ ​sus​ ​registros​ ​internos

Un registro permite guardar transitoriamente y acceder a valores muy usados,


generalmente en operaciones matemáticas. Permite almacenar y acceder datos usados
frecuentemente.​ ​Se​ ​emplean​ ​para​ ​aumentar​ ​la​ ​velocidad​ ​y​ ​ejecución​ ​de​ ​los​ ​programas.
-PC; Consiste en seguir la pista de la instrucción por buscar (capturar) en el siguiente
ciclo de máquina, Si una instrucción tiene una palabra de longitud, se agrega 01 a PC,
si​ ​la​ ​instrucción​ ​tiene​ ​dos​ ​palabras​ ​de​ ​longitud,​ ​se​ ​agrega​ ​02​ ​y​ ​así​ ​sucesivamente.
-MAR; Funciona como registro de enlace entre la CPU y el canal de direcciones, El
número de bit que hay en el MAR es igual al del canal de direcciones, Diferencia entre
MAR y PC, es que durante el ciclo de ejecución de una instrucción, el PC y el MAR
sirven para lo mismo, Algunas instrucciones de la máquina hacen referencia a la
memoria y operan con datos en ella, la dirección de los datos suele ser diferente de las
instrucciones​ ​(Necesita​ ​MAR)
-RD; proporciona un área de almacenamiento temporal (memoria intermedia o buffer)
de datos que se intercambian entre la CPU y la memoria, pueden ser instrucciones o
datos del operando. Por la conexión directa con el canal de datos el RD tiene el mismo
núm.​ ​de​ ​bit​ ​que​ ​dicho​ ​canal.
-IR; Conserva el código de operación de la instrucción en todo el ciclo de la máquina,
La​ ​longitud​ ​del​ ​ER​ ​es​ ​la​ ​longitud​ ​en​ ​bit​ ​del​ ​código​ ​de​ ​operación.
-PWS; es el estado (o condición) del programa, almacena información sobre el
programa en ejecución. Contiene bit que hacen posible que la computadora responda a
solicitudes​ ​de​ ​servicio​ ​asincrónicas​ ​generadas​ ​por​ ​dispositivos​ ​E-S.
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.

5
1.3​ ​La​ ​memoria​ ​principal​ ​(RAM)

RAM​ ​(Random​ ​Access​ ​Memory)


Localización:​ ​Interna​ ​(se​ ​encuentra​ ​en​ ​la​ ​placa​ ​base)
Capacidad: Hoy en día no es raro encontrar ordenadores PC equipados con 64, 128 ó
256​ ​Mb​ ​de​ ​memoria​ ​RAM.
Método de acceso: La RAM es una memoria de acceso aleatorio. Esto significa que
una palabra o byte se puede encontrar de forma directa, sin tener en cuenta los bytes
almacenados antes o después de dicha palabra (al contrario que las memorias en
cinta, que requieren de un acceso secuencial). Además, la RAM permite el acceso para
lectura​ ​y​ ​escritura​ ​de​ ​información.
Velocidad de acceso: Actualmente se pueden encontrar sistemas de memoria RAM
capaces de realizar transferencias a frecuencias del orden de los Gbps (gigabits por
segundo). También es importante anotar que la RAM es una memoria volátil, es decir,
requiere de alimentación eléctrica para mantener la información. En otras palabras, la
RAM​ ​pierde​ ​toda​ ​la​ ​información​ ​al​ ​desconectar​ ​el​ ​ordenador.
la memoria DRAM (Dynamic Random Access Memory) es la que montan las placas
base como memoria principal del sistema, donde se almacenan las aplicaciones en
ejecución y los datos que están gestionando en cada momento. Se refresca cientos de
veces por segundo y cuanto mayor cantidad pongamos a disposición del PC mejores
resultados​ ​obtendremos.

6
SRAM, Es la abreviatura de Static Random Access Memory y es la alternativa a la
DRAM. No precisa de tanta electricidad como la anterior para su refresco y movimiento
de las direcciones de memoria, por lo que funciona más rápida, aunque tiene un
elevado precio. (Volátiles y no volátiles, NVRAM(non-volatile random access memory),
MRAM(Magnetoresistive​ ​random-access​ ​memory))
Tag RAM, este tipo de memoria almacena las direcciones de memoria de cada uno de
los datos de la DRAM almacenados en la memoria caché del sistema. Así, si el
procesador requiere un dato y encuentra su dirección en la Tag RAM, va a buscarlo
inmediatamente​ ​a​ ​la​ ​caché,​ ​lo​ ​que​ ​agiliza​ ​el​ ​proceso.

7
1.4​ ​El​ ​concepto​ ​de​ ​interrupciones

Definición​ ​1:

Una interrupción es una operación que suspende la ejecución de un programa de modo


que el sistema pueda realizar una acción especial. La rutina de interrupción ejecuta y
por lo regular regresa el control al procedimiento que fue interrumpido, el cual entonces
reasume​ ​su​ ​ejecución.

Definición​ ​2:

Una interrupción es el rompimiento en la secuencia de un programa para ejecutar un


programa especial llamando una rutina de servicio cuya característica principal es que
al​ ​finalizar​ ​regresa​ ​al​ ​punto​ ​donde​ ​se​ ​interrumpió​ ​el​ ​programa.

8
Dentro​ ​de​ ​una​ ​computadora​ ​existen​ ​dos​ ​clases​ ​de​ ​interrupciones:

Interrupciones por software: Son aquellas programadas por el usuario, es decir, el


usuario decide cuando y donde ejecutarlas, generalmente son usadas para realizar
entrada​ ​y​ ​salida.

Interrupciones por hardware: ​Son aquellas que son provocadas por dispositivos
externos al procesador su característica principal es que no son programadas, esto es,
pueden​ ​ocurrir​ ​en​ ​cualquier​ ​momento​ ​en​ ​el​ ​programa.

Existen​ ​dos​ ​clases​ ​de​ ​interrupciones​ ​de​ ​este​ ​tipo:

Interrupciones por hardware enmascarables​: Aquellas en las que el usuario decide si


quiere​ ​o​ ​no​ ​ser​ ​interrumpido.

Interrupciones​ ​por​ ​hardware​ ​no​ ​enmascarables​ ​(NMI)​:​ ​Aquellas​ ​que​ ​siempre


interrumpen​ ​al​ ​programa.

​​

Las​ ​interrupciones​ ​por​ ​software​ ​se​ ​ejecutan​ ​con​ ​ayuda​ ​de​ ​las​ ​instrucciones:​ ​INT​ ​e
IRET,​ ​además​ ​se​ ​tiene​ ​256​ ​interrupciones:​ ​de​ ​la​ ​00​ ​a​ ​la​ ​FF.

Asociado al concepto de interrupción se tiene un área de memoria llamada vector de


interrupciones; la cual contiene las direcciones de las rutinas de servicio de cada
interrupción.​ ​Esta​ ​área​ ​se​ ​encuentra​ ​en​ ​el​ ​segmento​ ​0000:0000.

9
Para​ ​cada​ ​una​ ​de​ ​las​ ​direcciones​ ​se​ ​utilizan​ ​4​ ​bytes,​ ​dos​ ​bytes​ ​para​ ​el​ ​segmento​ ​y​ ​2
para​ ​el​ ​desplazamiento.​ ​La​ ​instrucción​ ​INT​ ​tipo,​ ​realiza​ ​las​ ​siguientes​ ​tareas:

● 1.-​ ​Salvar​ ​el​ ​registro​ ​de​ ​banderas.


● 2.-​ ​Salvar​ ​el​ ​IP​ ​de​ ​la​ ​dirección​ ​de​ ​regreso.
● 3.-​ ​Salvar​ ​el​ ​CS​ ​de​ ​la​ ​dirección​ ​de​ ​regreso.
● 4.-​ ​Salva​ ​los​ ​registros.
● 5.-​ ​Calcula​ ​el​ ​área​ ​donde​ ​está​ ​la​ ​dirección​ ​de​ ​la​ ​rutina​ ​de​ ​servicio​ ​de​ ​la​ ​siguiente
manera:​ ​tipo​ ​*4,​ ​en​ ​el​ ​vector​ ​de​ ​interrupciones.
● 6.-​ ​Ejecuta​ ​la​ ​rutina​ ​de​ ​servicio.

A​ ​su​ ​vez,​ ​IRET,​ ​que​ ​regresa​ ​de​ ​la​ ​interrupción,​ ​ejecuta​ ​lo​ ​siguiente:
1.-​ ​Desempila​ ​los​ ​registros.
2.-​ ​Desempila​ ​la​ ​dirección​ ​de​ ​regreso.
3.-​ ​Desempila​ ​el​ ​registro​ ​de​ ​bandera.

10
Tabla​ ​de​ ​interrupciones​ ​del​ ​sistema.

​​​​​​​​​​​

Al encender la computadora se ejecuta un programa; llamada rutina iniciadora; que


inicia todo el sistema dicho programa esta almacenado en la memoria ROM, y forma
parte del BIOS que es un conjunto de rutinas básicas para realizar E/S a dispositivos.
Las​ ​funciones​ ​son:

1. Realiza​ ​una​ ​prueba​ ​de​ ​memoria.


2. Inicia​ ​el​ ​vector​ ​de​ ​interrupciones.
3. Inicia​ ​circuitos​ ​de​ ​soporte​ ​y​ ​dispositivos​ ​de​ ​E/S.
4. Realiza​ ​el​ ​proceso​ ​conocido​ ​como​ ​el​ ​BOOT​ ​STRAP​ ​que​ ​consiste​ ​en​ ​leer​ ​el
sector​ ​del​ ​disco​ ​en​ ​memoria,​ ​dicho​ ​sector​ ​contiene​ ​un​ ​programa​ ​que​ ​pasará​ ​el
sistema​ ​operativo​ ​a​ ​la​ ​memoria​ ​y​ ​le​ ​transfiere​ ​el​ ​control.

Las interrupciones del BIOS siempre están disponibles al usuario, en cambio las del
sistema operativo, sólo si es sistema se ha cargado en memoria. BIOS permite realizar
entrada y salida a dispositivos, el acceso a éstas rutinas es también por medio de
interrupciones​ ​de​ ​software​ ​y​ ​enviando​ ​parámetros​ ​a​ ​través​ ​de​ ​los​ ​registros.

La​ ​interrupción​ ​21h​ ​permite​ ​leer​ ​de​ ​teclado,​ ​escribir​ ​en​ ​vídeo,​ ​escribir​ ​en​ ​impresora,
leer​ ​y​ ​escribir​ ​de​ ​dispositivo​ ​auxiliar,​ ​además​ ​realizar​ ​cambios​ ​en​ ​el​ ​vector​ ​de
interrupciones,​ ​obtener​ ​y​ ​poner​ ​tanto​ ​la​ ​fecha​ ​como​ ​la​ ​hora.

11
1.5​ ​Llamadas​ ​a​ ​servicios​ ​del​ ​sistema

Es el mecanismo usado por una aplicación para solicitar un servicio al sistema


operativo.

Las llamadas al sistema comúnmente usan una instrucción especial de la CPU que
causa que el procesador transfiere el control a un código privilegiado, previamente
especificado por el mismo código. Esto permite al código privilegiado especificar donde
va​ ​a​ ​ser​ ​conectado​ ​así​ ​como​ ​el​ ​estado​ ​del​ ​procesador.

Cuando  una  llamada  al  sistema  es  invocada,  la  ejecución  del  programa  que  invoca es 
interrumpida  y  sus  datos  son  guardados,  normalmente  en  su  PCB  (Bloque  de  Control 
de  Proceso),  para  poder  continuar  ejecutándose  luego.  El  procesador  entonces 
comienza  a  ejecutar  las  instrucciones  de  código  de  alto  nivel  de  privilegio,  para 
realizar  la  tarea  requerida.  Cuando  esta  finaliza,  se  retorna  al  proceso  original,  y 
continúa  su  ejecución.  El  retorno  al  proceso  demandante  no  obligatoriamente  es 
inmediato,  depende  del  tiempo  de  ejecución  de  la llamada al sistema y del algoritmo 
de​ ​planificación​ ​de​ ​CPU.

12
Las llamadas al sistema para una ejecución y el control de programas, usualmente
incluyen un conjunto completo de los servicios accesibles por la vía de lenguajes de
órdenes, tales como: RUN, EXECUTE, ABORT y planificación relacionada con el
tiempo, además los usuarios con las llamadas del sistema pueden suspender,
establecer​ ​o​ ​cambiar​ ​atributos​ ​del​ ​tiempo​ ​de​ ​ejecución​ ​de​ ​uno​ ​o​ ​más​ ​programas.
También se proporcionan algunas facilidades muy extendidas en sistemas de tiempo
real,​ ​para​ ​comunicación​ ​entre​ ​programas​ ​y​ ​sincronización.

La siguiente imagen ilustra la relación entre la Shell y el Kernel. Recordemos que el


Shell es lo que el sistema operativo nos muestra, la portada, el intérprete de comando,
etc.​ ​El​ ​Kernel​ ​es​ ​el​ ​núcleo​ ​del​ ​sistema.

13
1.6​ ​Métodos​ ​de​ ​Direccionamiento

Los​ ​llamados​ ​modos​ ​de​ ​direccionamiento​ ​son​ ​las​ ​diferentes​ ​maneras​ ​de​ ​especificar​ ​en
informática​ ​un​ ​operando​ ​dentro​ ​de​ ​una​ ​instrucción​ ​en​ ​lenguaje​ ​ensamblador.

Un​ ​modo​ ​de​ ​direccionamiento​ ​especifica​ ​la​ ​forma​ ​de​ ​calcular​ ​la​ ​dirección​ ​de​ ​memoria​ ​efectiva
de​ ​un​ ​operando​ ​mediante​ ​el​ ​uso​ ​de​ ​la​ ​información​ ​contenida​ ​en​ ​registros​ ​y​ ​/​ ​o​ ​constantes,
contenida​ ​dentro​ ​de​ ​una​ ​instrucción​ ​de​ ​la​ ​máquina​ ​o​ ​en​ ​otra​ ​parte.

Las​ ​arquitecturas​ ​de​ ​computadores​ ​varían​ ​mucho​ ​en​ ​cuanto​ ​al​ ​número​ ​de​ ​modos​ ​de
direccionamiento​ ​que​ ​ofrecen​ ​desde​ ​el​ ​hardware.​ ​Eliminar​ ​los​ ​modos​ ​de​ ​direccionamiento​ ​más
complejos​ ​podría​ ​presentar​ ​una​ ​serie​ ​de​ ​beneficios,​ ​aunque​ ​podría​ ​requerir​ ​de​ ​instrucciones
adicionales,​ ​e​ ​incluso​ ​de​ ​otro​ ​registro.​ ​Se​ ​ha​ ​comprobado​ ​que​ ​el​ ​diseño​ ​de​ ​CPUs​ ​segmentadas
es​ ​mucho​ ​más​ ​fácil​ ​si​ ​los​ ​únicos​ ​modos​ ​de​ ​direccionamiento​ ​que​ ​proporcionan​ ​son​ ​simples.

Tipos​ ​de​ ​direccionamiento

Implícito
En​ ​este​ ​modo​ ​de​ ​direccionamiento​ ​no​ ​es​ ​necesario​ ​poner​ ​ninguna​ ​dirección​ ​de​ ​forma​ ​explícita,
ya​ ​que​ ​en​ ​el​ ​propio​ ​código​ ​de​ ​operación​ ​se​ ​conoce​ ​la​ ​dirección​ ​de​ ​el/los​ ​operando/s​ ​al​ ​(a​ ​los)
que​ ​se​ ​desea​ ​acceder​ ​o​ ​con​ ​el/los​ ​que​ ​se​ ​quiere​ ​operar.

Inmediato
En​ ​la​ ​instrucción​ ​está​ ​incluido​ ​directamente​ ​el​ ​operando.
En​ ​este​ ​modo​ ​el​ ​operando​ ​es​ ​especificado​ ​en​ ​la​ ​instrucción​ ​misma.​ ​En​ ​otras​ ​palabras,​ ​una
instrucción​ ​de​ ​modo​ ​inmediato​ ​tiene​ ​un​ ​campo​ ​de​ ​operando​ ​en​ ​vez​ ​de​ ​un​ ​campo​ ​de​ ​dirección.
El​ ​campo​ ​del​ ​operando​ ​contiene​ ​el​ ​operando​ ​actual​ ​que​ ​se​ ​debe​ ​utilizar​ ​en​ ​conjunto​ ​con​ ​la
operación​ ​especificada​ ​en​ ​la​ ​instrucción.​ ​Las​ ​instrucciones​ ​de​ ​modo​ ​inmediato​ ​son​ ​útiles​ ​para
inicializar​ ​los​ ​registros​ ​en​ ​un​ ​valor​ ​constante.

Directo
El​ ​campo​ ​de​ ​operando​ ​en​ ​la​ ​instrucción​ ​contiene​ ​la​ ​dirección​ ​en​ ​memoria​ ​donde​ ​se​ ​encuentra
el​ ​operando.
En​ ​este​ ​modo​ ​la​ ​dirección​ ​efectiva​ ​es​ ​igual​ ​a​ ​la​ ​parte​ ​de​ ​dirección​ ​de​ ​la​ ​instrucción.​ ​El​ ​operando
reside​ ​en​ ​la​ ​memoria​ ​y​ ​su​ ​dirección​ ​es​ ​dada​ ​directamente​ ​por​ ​el​ ​campo​ ​de​ ​dirección​ ​de​ ​la
instrucción.​ ​En​ ​una​ ​instrucción​ ​de​ ​tipo​ ​ramificación​ ​el​ ​campo​ ​de​ ​dirección​ ​especifica​ ​la​ ​dirección
de​ ​la​ ​rama​ ​actual.

14
Indirecto
El​ ​campo​ ​de​ ​operando​ ​contiene​ ​una​ ​dirección​ ​de​ ​memoria,​ ​en​ ​la​ ​que​ ​se​ ​encuentra​ ​la​ ​dirección
efectiva​ ​del​ ​operando.
Si​ ​hace​ ​referencia​ ​a​ ​un​ ​registro​ ​de​ ​la​ ​máquina,​ ​la​ ​dirección​ ​de​ ​memoria​ ​(dirección​ ​efectiva)​ ​que
contiene​ ​el​ ​dato​ ​estará​ ​en​ ​este​ ​registro​ ​y​ ​hablaremos​ ​de​ ​direccionamiento​ ​indirecto​ ​a​ ​registro;
si​ ​hace​ ​referencia​ ​a​ ​una​ ​posición​ ​de​ ​memoria,​ ​la​ ​dirección​ ​de​ ​memoria​ ​(dirección​ ​efectiva)​ ​que
contiene​ ​el​ ​dato​ ​estará​ ​almacenada​ ​en​ ​esta​ ​posición​ ​de​ ​memoria​ ​y​ ​hablaremos​ ​de
direccionamiento​ ​indirecto​ ​a​ ​memoria.

Absoluto
El​ ​campo​ ​de​ ​operando​ ​contiene​ ​una​ ​dirección​ ​en​ ​memoria,​ ​en​ ​la​ ​que​ ​se​ ​encuentra​ ​la
instrucción.​ ​Y​ ​no​ ​se​ ​cancela.

De​ ​registro
Sirve​ ​para​ ​especificar​ ​operandos​ ​que​ ​están​ ​en​ ​registros.
En​ ​este​ ​modo,​ ​los​ ​operandos​ ​están​ ​en​ ​registros​ ​que​ ​residen​ ​dentro​ ​de​ ​la​ ​CPU.

Indirecto​ ​mediante​ ​registros


El​ ​campo​ ​de​ ​operando​ ​de​ ​la​ ​instrucción​ ​contiene​ ​un​ ​identificador​ ​de​ ​registro​ ​en​ ​el​ ​que​ ​se
encuentra​ ​la​ ​dirección​ ​efectiva​ ​del​ ​operando.
En​ ​este​ ​modo​ ​el​ ​campo​ ​de​ ​la​ ​dirección​ ​de​ ​la​ ​instrucción​ ​da​ ​la​ ​dirección​ ​en​ ​donde​ ​la​ ​dirección
efectiva​ ​se​ ​almacena​ ​en​ ​la​ ​memoria.​ ​El​ ​control​ ​localiza​ ​la​ ​instrucción​ ​de​ ​la​ ​memoria​ ​y​ ​utiliza​ ​su
parte​ ​de​ ​dirección​ ​para​ ​acceder​ ​a​ ​la​ ​memoria​ ​de​ ​nuevo​ ​para​ ​leer​ ​una​ ​dirección​ ​efectiva.

De​ ​desplazamiento
Combina​ ​el​ ​modo​ ​directo​ ​e​ ​indirecto​ ​mediante​ ​registros.

De​ ​pila
Se​ ​utiliza​ ​cuando​ ​el​ ​operando​ ​está​ ​en​ ​memoria​ ​y​ ​en​ ​la​ ​cabecera​ ​de​ ​la​​ ​pila​.
Este​ ​direccionamiento​ ​se​ ​basa​ ​en​ ​las​ ​estructuras​ ​denominadas​ ​Pila​ ​(tipo​ ​LIFO),​ ​las​ ​cuales
están​ ​marcados​ ​por​ ​el​ ​fondo​ ​de​ ​la​ ​pila​ ​y​ ​el​ ​puntero​ ​de​ ​pila​ ​(*SP).​ ​El​ ​puntero​ ​de​ ​pila​ ​apunta​ ​a​ ​la
última​ ​posición​ ​ocupada.​ ​Así,​ ​como​ ​puntero​ ​de​ ​direccionamiento​ ​usaremos​ ​el​ ​SP.

Relativo​ ​a​ ​un​ ​registro​ ​base


Consiste,​ ​al​ ​igual​ ​que​ ​el​ ​indirecto​ ​a​ ​través​ ​de​ ​registro,​ ​en​ ​calcular​ ​la​ ​dirección​ ​efectiva​ ​(EA,
effective​ ​address​)​ ​como​ ​la​ ​suma​ ​del​ ​contenido​ ​del​ ​registro​ ​base​ ​y​ ​un​ ​cierto​ ​desplazamiento
(​offset​)​ ​que​ ​siempre​ ​será​ ​positivo.

15
Relativo​ ​a​ ​un​ ​registro​ ​índice
Es​ ​similar​ ​al​ ​direccionamiento​ ​relativo​ ​a​ ​un​ ​registro​ ​base,​ ​excepto​ ​que​ ​es​ ​el​ ​contenido​ ​del
registro​ ​índice​ ​el​ ​que​ ​indica​ ​el​ ​desplazamiento​ ​que​ ​se​ ​produce​ ​a​ ​partir​ ​de​ ​una​ ​dirección​ ​de
memoria​ ​que​ ​se​ ​pasa​ ​también​ ​como​ ​argumento​ ​a​ ​la​ ​orden​ ​que​ ​utiliza​ ​este​ ​modo​ ​de
direccionamiento.

Indexado​ ​respecto​ ​a​ ​una​ ​base


Se​ ​trata​ ​de​ ​una​ ​combinación​ ​de​ ​los​ ​dos​ ​anteriores​ ​y​ ​consiste​ ​en​ ​calcular​ ​la​ ​dirección​ ​efectiva
como:

Relativo​ ​al​ ​contador​ ​de​ ​programa


Consiste​ ​en​ ​dirección​ ​una​ ​posición​ ​de​ ​memoria​ ​usando​ ​como​ ​registro​ ​base​ ​al​ ​contador​ ​de
programa​ ​(PC),​ ​el​ ​funcionamiento​ ​es​ ​análogo​ ​al​ ​direccionamiento​ ​respecto​ ​a​ ​registro​ ​base​ ​con
la​ ​salvedad​ ​de​ ​que,​ ​en​ ​este​ ​caso,​ ​el​ ​offset​ ​puede​ ​ser​ ​también​ ​negativo.

Indexado​ ​con​ ​autoincremento/autodecremento


Es​ ​un​ ​modo​ ​de​ ​direccionamiento​ ​análogo​ ​al​ ​indexado,​ ​explicado​ ​anteriormente.
La​ ​única​ ​diferencia​ ​es​ ​que​ ​permite​ ​un​ ​incremento​ ​o​ ​decremento​ ​de​ ​la​ ​dirección​ ​final​ ​o​ ​el
registro​ ​índice

Instrucción​ ​de​ ​salto​ ​con​ ​direccionamiento​ ​absoluto


Consiste​ ​en​ ​cargar​ ​en​ ​el​ ​PC​ ​el​ ​valor​ ​que​ ​se​ ​especifica

Instrucción​ ​de​ ​salto​ ​con​ ​direccionamiento​ ​relativo


Es​ ​parecida​ ​a​ ​la​ ​especificada​ ​anteriormente​ ​la​ ​diferencia​ ​es​ ​que​ ​el​ ​salto​ ​es​ ​relativo​ ​al​ ​PC,
pongamos​ ​un​ ​ejemplo:​ ​supongamos​ ​que​ ​PC​ ​vale​ ​=​ ​0x0A,​ ​si​ ​nosotros​ ​interpretamos​ ​la
instrucción​ ​jr​ ​+03,​ ​saltaremos​ ​tres​ ​posiciones​ ​posteriores​ ​a​ ​PC​ ​(también​ ​podría​ ​ser​ ​-03​ ​y​ ​serían
posiciones​ ​anteriores).

Direccionamiento​ ​paginado
En​ ​el​ ​paginado​​ ​la​ ​memoria​ ​se​ ​encuentra​ ​actualmente​ ​dividida​ ​en​ ​páginas​ ​(bloques​ ​de​ ​igual
longitud).
Para​ ​obtener​ ​las​ ​direcciones​ ​se​ ​necesita:
● Indicador​ ​de​ ​página​ ​(IP):​ ​en​ ​un​ ​registro​ ​específico​ ​o​ ​de​ ​propósito​ ​general​ ​de​ ​la​ ​máquina.
● Dirección​ ​de​ ​la​ ​palabra​ ​(DP):​ ​en​ ​el​ ​campo​ ​CD​ ​de​ ​la​ ​instrucción.
Así,​ ​concatenando​ ​ambas​ ​partes​ ​se​ ​obtiene​ ​la​ ​dirección​ ​completa.

16
1.7​ ​Proceso​ ​de​ ​ensamblado​ ​y​ ​ligado

EDICIÓN
Los archivos fuente de código ensamblador deben estar en formato ASCII standard. Para esto
puede usarse cualquier editor que permita crear archivos sin formato, e.g. Edlin, Edit, Write, El
editor del Turbo Pascal, Works, Word, WordStar, etcétera. Las declaraciones pueden ser
introducidas en mayúsculas y/o minúsculas. Una buena práctica de programación es poner
todas las palabras reservadas (directivas e instrucciones) en mayúsculas y todo lo del usuario
en​ ​minúsculas​ ​para​ ​fines​ ​de​ ​facilidad​ ​de​ ​lectura​ ​del​ ​código.

Las sentencias pueden comenzar en cualquier columna, no pueden tener más de 128
caracteres, no se permiten lineas múltiples ni códigos de control, y cada línea debe ser
terminada con una combinación de line-feed y carriage-return. Los comentarios se declaran
con;​ ​y​ ​terminan​ ​al​ ​final​ ​de​ ​la​ ​línea.

ENSAMBLADO
El ensamblado se lleva a cabo invocando al MASM. Este puede ser invocado, usando una línea
de​ ​comando,​ ​de​ ​la​ ​siguiente​ ​manera:

MASM​ ​archivo​ ​[,[objeto][,[listado][,[cross]]]]][opciones][;]

Dónde:

Objeto​.-​ ​Es​ ​el​ ​nombre​ ​para​ ​el​ ​archivo​ ​objeto.


Listado​.- Nombre del archivo de listado de ensamblado. cross. Es un archivo de referencias
cruzadas.
LINK De la misma forma que el ensamblado, la fase de liga se lleva a cabo con el LINK. Este
puede​ ​ser​ ​invocado​ ​de​ ​la​ ​misma​ ​forma​ ​que​ ​el​ ​MASM.​ ​Los​ ​parámetros​ ​que​ ​este​ ​requiere​ ​son:
​ ​LINK​ ​objeto​ ​[,[ejecutable][,[mapa][,[librería]]]]][opciones][;]

Dónde:
Objeto.-​ ​Es​ ​el​ ​nombre​ ​para​ ​el​ ​archivo​ ​.OBJ
Ejecutable.-​ ​Nombre​ ​del​ ​archivo​ ​.EXE
Mapa.-​ ​Nombre​ ​del​ ​archivo​ ​mapa
Librería.-​ ​Nombre​ ​del​ ​archivo​ ​biblioteca​ ​de​ ​rutinas

17
EJECUCIÓN
Para la ejecución del programa simplemente basta teclear su nombre en el prompt de MS-DOS
y teclear ENTER. Con esto el programa será cargado en memoria y el sistema procederá a
ejecutarlo. El proceso completo para poder crear un programa ejecutable con el Microsoft
Macro​ ​Assembler​ ​se​ ​muestra​ ​abajo.

18
1.8​ ​Desplegado​ ​de​ ​mensajes​ ​en​ ​el​ ​monitor

En este momento podemos comenzar a escribir las verdaderas instrucciones que le indicarán a
la computadora que mensaje y como lo va a desplegar. Sugiero que comencemos por borrar la
pantalla. Esto se puede realizar de muy diversas formas, aquí lo haremos usando el BIOS, el
cual es un microchip que se encuentra dentro de toda PC y controla las funciones básicas de
entrada y salida (​B​asic ​I​nput ​O​utput ​Sy​ stem). Lo que haremos es decirle al chip "¡Hey! dime en
qué modo está trabajando la tarjeta de video", cuando obtengamos la respuesta le diremos:
"Dile a la tarjeta de video que deje de trabajar en ese modo y que comience a trabajar en el
modo de video que me diste". Una instrucción rara, pues lo que le estamos ordenando es que
deje de trabajar en el modo en el que está trabajando !y que comience a trabajar en ese mismo
modo!​ ​Así​ ​se​ ​lo​ ​decimos​ ​en​ ​su​ ​propio​ ​lenguaje:

principio:

mov​ ​ah,​ ​0fh


int​ ​10h

mov​ ​ah,​ ​0
int​ ​10h

Lo primero que vemos es una "etiqueta", con ella le damos nombre a un punto dentro del
código, si más tarde dentro del programa deseamos repetir esta parte del código solo tenemos
que decir "salta a 'principio'" y ya está. El primer grupo de instrucciones después de la etiqueta
le dicen al BIOS que obtenga la modalidad en la que está trabajando el video. Aquí vemos por
primera vez una interrupción (int 10h). Las interrupciones son funciones ya incorporadas dentro
del BIOS y del sistema operativo MS-DOS que realizan tareas comunes como leer del disco,
mostrar un mensaje en el monitor, o ¡borrar la pantalla!. Enseguida, mediante una función de la
interrupción​ ​10h,​ ​le​ ​decimos​ ​que​ ​cambie​ ​a​ ​la​ ​misma​ ​modalidad​ ​de​ ​video.

19
Bueno, ahora que la pantalla está limpia, podemos mostrar nuestro mensaje en el monitor. Aquí
está​ ​el​ ​código:

lea​ ​dx,​ ​mensaje_a_mostrar


mov​ ​ah,​ ​9h
int​ ​21h

Con​ ​la​ ​primera​ ​instrucción​ ​le​ ​decimos​ ​al​ ​procesador​ ​"Carga​ ​en​ ​el​ ​registro​ ​DX,​ ​la​ ​dirección​ ​de
memoria​ ​de​ ​la​ ​variable​ ​llamada​ ​'mensaje_a_mostrar'".​ ​Enseguida​ ​le​ ​decimos​ ​que​ ​la​ ​despliegue
en​ ​pantalla​ ​con​ ​la​ ​función​ ​9h​ ​de​ ​la​ ​interrupción​ ​21h.

Nuestra​ ​tarea​ ​está​ ​terminada,​ ​así​ ​que​ ​digámosle​ ​a​ ​la​ ​computadora​ ​que​ ​no​ ​hay​ ​más
instrucciones​ ​que​ ​procesar.

int​ ​20h
​ ​Las​ ​instrucciones​ ​están​ ​terminadas,​ ​pero​ ​todavía​ ​tenemos​ ​que​ ​decirle​ ​a​ ​la​ ​computadora​ ​que
valor​ ​va​ ​a​ ​tener​ ​la​ ​variable​ ​'mensaje_a_mostrar'.

mensaje_a_mostrar​ ​db​ ​"¡Hola​ ​Mundo!$",0

El​ ​signo​ ​de​ ​pesos​ ​al​ ​final​ ​de​ ​la​ ​cadena,​ ​es​ ​necesario​ ​para​ ​que​ ​el​ ​sistema​ ​operativo​ ​sepa​ ​en
donde​ ​se​ ​acaba​ ​la​ ​cadena​ ​(una​ ​cadena​ ​es​ ​un​ ​grupo​ ​de​ ​caracteres)​ ​que​ ​va​ ​a​ ​desplegar.

Una​ ​vez​ ​que​ ​terminamos​ ​con​ ​las​ ​instrucciones​ ​y​ ​valores​ ​para​ ​la​ ​máquina,​ ​hay​ ​que​ ​marcar​ ​el
archivo​ ​para​ ​que​ ​el​ ​compilador​ ​sepa​ ​que​ ​ya​ ​terminamos​ ​de​ ​darle​ ​instrucciones​ ​a​ ​la​ ​máquina.

CODE​ ​ENDS​ ​end​ ​principio


¡Al​ ​fin!​ ​¡Llegamos​ ​al​ ​final!​ ​Aquí​ ​está​ ​el​ ​código​ ​fuente​ ​completo:

CODE​ ​SEGMENT​ ​ASSUME​ ​CS:​ ​CODE,​ ​DS:​ ​CODE,​ ​SS:​ ​CODE,​ ​ES:​ ​CODE
ORG​ ​100h

Principio:

mov​ ​ah,​ ​0Fh

20
mov​ ​ah,​ ​0
int​ ​10h

lea​ ​dx,​ ​mensaje_a_mostrar


mov​ ​ah,​ ​9h
int​ ​21h

int​ ​20h

mensaje_a_mostrar​ ​db​ ​"¡Hola​ ​Mundo!$",0

CODE​ ​ENDS
end​ ​principio

21
Conclusión:
Los​ ​lenguajes​ ​de​ ​bajo​ ​nivel​ ​as.​ ​como​ ​el​ ​lenguaje​ ​ensamblador​ ​es​ ​esencial​ ​como
ingenieros​ ​en​ ​sistemas​ ​computacionales​ ​que​ ​tengamos​ ​conocimiento​ ​profundo​ ​en​ ​ésta
.rea,​ ​de​ ​igual​ ​manera​ ​los​ ​componentes​ ​importantes​ ​y​ ​esenciales​ ​que​ ​hacen​ ​que
nuestro​ ​equipo​ ​de​ ​cómputo​ ​funcione,​ ​desde​ ​la​ ​memoria​ ​principal​ ​que​ ​es​ ​la​ ​memoria
RAM,​ ​comprender​ ​la​ ​jerarquia​ ​de​ ​las​ ​memorias​ ​y​ ​c.mo​ ​funciona​ ​cada​ ​uno,​ ​hasta​ ​los
conceptos​ ​de​ ​interrupciones​ ​y​ ​los​ ​m.todos​ ​de​ ​direccionamiento​ ​y​ ​los​ ​mensajes
enviados​ ​al​ ​monitor​ ​utilizando​ ​las​ ​interrupciones​ ​disponibles​ ​en​ ​el​ ​sistema,​ ​debemos
conocer​ ​los​ ​temas​ ​de​ ​manera​ ​descriptiva​ ​para​ ​poder​ ​desarrollarnos​ ​en​ ​las​ ​.reas
necesarias​ ​de​ ​la​ ​programaci.n​ ​utilizando​ ​los​ ​conocimientos​ ​b.sicos​ ​del​ ​lenguaje​ ​de
interfaz.

22

You might also like