Lenguaje de Interfaz
UNIDAD I
ASENCIOS ARQUINIGO Lea
2021
- Lenguaje de Interfaz
Lenguaje de Interfaz
Contents
INTRODUCCIÓN..............................................................................................................................................3
1.1. Importancia de la programación en lenguaje ensamblador.................................................................4
1.2 El procesador y sus registros internos.......................................................................................................4
1.3 La memoria principal (RAM)...................................................................................................................5
1.4 El concepto de interrupciones Definición:................................................................................................6
1.5 Llamadas a servicios del sistema..............................................................................................................6
1.6 Modos de direccionamiento......................................................................................................................7
1.7 Proceso de ensamblado y ligado...............................................................................................................7
1.8 Desplegado de mensajes en el monitor.....................................................................................................8
2
- Lenguaje de Interfaz
INTRODUCCIÓN.
Al desarrollarse las primeras computadoras electrónicas, se vio la necesidad de programarlas, es decir, de
almacenar en memoria la información sobre la tarea que iban a ejecutar. Las primeras se usaban como
calculadoras simples; se les indicaban los pasos de cálculo, uno por uno. Lenguaje Ensamblador es la primera
abstracción del Lenguaje de Máquina, consistente en asociar a los códigos de operación (OPCODES) palabras
clave que faciliten su uso por parte del programador. Como se puede ver, el Lenguaje Ensamblador es
directamente traducible al Lenguaje de Máquina, y viceversa; simplemente, es una abstracción que facilita su
uso para los seres humanos. Por otro lado, la computadora no entiende directamente el Lenguaje
Ensamblador; es necesario traducirle a Lenguaje de Máquina. Originalmente, este proceso se hacía a mano,
usando para ello hojas donde se escribían tablas de programa similares al ejemplo de la calculadora que vimos
anteriormente. Pero, al ser tan directa la traducción, pronto aparecieron los programas Ensambladores, que son
traductores que convierten el código fuente (en Lenguaje Ensamblador) a código objeto (es decir, a Lenguaje
de Máquina). Una característica que hay que resaltar, es que al depender estos lenguajes del hardware, hay un
distinto Lenguaje de Máquina (y, por consiguiente, un distinto Lenguaje Ensamblador) para cada CPU. Por
ejemplo, podemos mencionar tres lenguajes completamente diferentes, que sin embargo vienen de la
aplicación de los conceptos anteriores:
1. Lenguaje Ensamblador de la familia Intel 80x86.
2. Lenguaje Ensamblador de la familia Motorola 68000.
3. Lenguaje Ensamblador del procesador POWER, usado en las IBM RS/6000.
3
- Lenguaje de Interfaz
1.1. Importancia de la programación en lenguaje ensamblador.
Para comenzar el curso empezaremos conociendo que es el lenguaje ensamblador que utilizaremos y
algunos conceptos básicos del mismo: Definición: 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. 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 él 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.
1.2. El procesador y sus registros internos.
Los registros del procesador se emplean para controlar instrucciones en ejecución, manejar
direccionamiento de memoria y proporcionar capacidad aritmética. Los registros son direccionarle por
medio de un nombre. Los bits por convención, se numeran de derecha a izquierda, como en: ... 15 14
13 12 11 10 9 8 7 6 5 4 3 2 1 0 Registros de segmento Un registro de segmento tiene 16 bits de
longitud y facilita un área de memoria para direccionamiento conocida como el segmento actual.
Registro CS. El DOS almacena la dirección inicial del segmento de código de un programa en el
registro CS. Esta dirección de segmento, más un valor de desplazamiento en el registro apuntador de
instrucción (IP), indica la dirección de una instrucción que es buscada para su ejecución. Registro DS.
La dirección inicial de un segmento de datos de programa es almacenada en el registro DS. En
términos sencillos, esta dirección, más un valor de desplazamiento en una instrucción, genera una
referencia a la localidad de un byte específico en el segmento de datos. Registro SS. El registro SS
permite la colocación en memoria de una pila, para almacenamiento temporal de direcciones y datos.
El DOS almacena la dirección de inicio del segmento de pila de un programa en el registro SS. Esta
dirección de segmento, más un valor de desplazamiento en el registro del apuntador de pila (SP),
indica la palabra actual en la pila que está siendo direccionada. Registros ES. Algunas operaciones
con cadenas de caracteres (datos de caracteres) utilizan el registro extra de segmento para manejar el
direccionamiento de memoria. En este contexto, el registro ES está asociado con el registro DI
(índice). Un programa que requiere el uso del registro ES puede inicializarlo con una dirección de
segmento apropiada. Registros FS y GS. Son registros extra de segmento en los procesadores 80386 y
posteriores. Registros de propósito general.
4
- Lenguaje de Interfaz
Los registros de propósito general AX, BX, CX y DX son los caballos de batalla del sistema. Son
únicos en el sentido de que se puede direccionarlos como una palabra o como una parte de un byte. El
último byte de la izquierda es la parte "alta", y el ultimo byte de la derecha es la parte "baja". Por
ejemplo, el registro CX consta de una parte CH (alta) y una parte Cl (baja), y usted puede referirse a
cualquier parte por su nombre.
Registro AX. El registro AX, el acumulador principal, es utilizado para operaciones que implican
entrada/salida y la mayor parte de la aritmética. Por ejemplo, las instrucciones para multiplicar, dividir
y traducir suponen el uso del AX. También, algunas operaciones generan código más eficiente si se
refieren al AX en lugar de a los otros registros.
1.3. La memoria principal (RAM)
La memoria principal o primaria,"Memoria Central ", es aquella memoria de un ordenador, donde se
almacenan temporalmente tanto los datos como los programas que la CPU está procesando o va a
procesar en un determinado momento. Por su función, es una amiga inseparable del microprocesador,
con el cual se comunica a través de los buses de datos. Por ejemplo, cuando la CPU tiene que ejecutar
un programa, primero lo coloca en la memoria y después lo empieza a ejecutar. Lo mismo ocurre
cuando necesita procesar una serie de datos; antes de poder procesarlos los tiene que llevar a la
memoria principal. Esta clase de memoria es volátil, es decir que, cuando se corta la energía eléctrica,
se borra toda la información que estuviera almacenada en ella. Por su función, la cantidad de memoria
RAM de que disponga una computadora es una factor muy importante; hay programas y juegos que
requieren una gran cantidad de memoria para poder usarlos. Otros andarán más rápido si el sistema
cuenta con más memoria RAM. La memoria Caché: dentro de la memoria RAM existe una clase de
memoria denominada Memoria Caché que tiene la característica de ser más rápida que las otras,
permitiendo que el intercambio de información entre el procesador y la memoria principal sea a mayor
velocidad. La estructura de la memoria principal ha cambiado en la historia de las computadoras.
Desde los años 1980 es prevalentemente una unidad dividida en celdas que se identifican mediante
una dirección. Está formada por bloques de circuitos integrados o chips capaces de almacenar, retener
o "memorizar" información digital, es decir, valores binarios; a dichos bloques tiene acceso el
microprocesador de la computadora. La MP se comunica con el microprocesador de la CPU mediante
el bus de direcciones. El ancho de este bus determina la capacidad que posea el microprocesador para
el direccionamiento de direcciones en memoria. En algunas oportunidades suele llamarse "memoria
interna" a la MP, porque a diferencia de los dispositivos de memoria secundaria, la MP no puede
extraerse tan fácilmente por usuarios no técnicos. La MP es el núcleo del sub-sistema de memoria de
una computadora, y posee una menor capacidad de almacenamiento que la memoria secundaria, pero
una velocidad millones de veces superior. Si tienes más memoria almacenas más datos.
5
- Lenguaje de Interfaz
1.4. El concepto de interrupciones Definición:
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. 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.
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 transfiera 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 del
inglés Process Control Block), 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
6
- Lenguaje de Interfaz
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.
1.6. Modos 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. Diferentes 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. La mayoría
de las máquinas RISC disponen de apenas cinco modos de direccionamiento simple, mientras que
otras máquinas CISC tales como el DEC VAX tienen más de una docena de modos de
direccionamiento, algunos de ellos demasiado complejos. El mainframe IBM System/360 disponía
únicamente de tres modos de direccionamiento; algunos más fueron añadidos posteriormente para el
System/390. Cuando existen solo unos cuantos modos, estos van codificados directamente dentro de
la propia instrucción (Un ejemplo lo podemos encontrar en el IBM/390, y en la mayoría de los RISC).
Sin embargo, cuando hay demasiados modos, a menudo suele reservarse un campo específico en la
propia instrucción, para especificar dicho modo de direccionamiento. El DEC VAX permitía múltiples
operandos en memoria en la mayoría de sus instrucciones, y reservaba los primeros bits de cada
operando para indicar el modo de direccionamiento de ese operando en particular. Incluso en
computadores con muchos modos de direccionamiento, algunas medidas realizadas a programas
indican que los modos más simples representan cerca del 90% o más de todos los modos de
direccionamiento utilizados. Dado que la mayoría de estas medidas son obtenidas a partir de códigos
de alto nivel generados a partir de compiladores, nos da una idea de las limitaciones que presentan los
compiladores que se utilizan.
1.7. Proceso de ensamblado y ligado.
EDICION 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 puese 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
7
- Lenguaje de Interfaz
archivo .EXE Mapa.- Nombre del archivo mapa Librería.- Nombre del archivo biblioteca de rutinas
EJECUCION 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.
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
(Basic Input Output System). 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.
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
8
- Lenguaje de Interfaz
¡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
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
[Link]
[Link]