Lenguaje Emu8086
Lenguaje Emu8086
Lenguaje Emu8086
Trabajo de Programación ll
EMU8086
GRUPO: 2M3-Eo
FECHA: 12-08-2019
INTRODUCCIÓN
EMU8086 es un emulador que posee una interfaz de usuario muy amistosa que permite familiarizarse
con los fundamentos de la programación en lenguaje ensamblador de forma muy intuitiva, aparte de
eso brinda una serie de recursos para ejecutar y depurar los programas. También tiene algunas
desventajas como el de no soportar algunas de las interrupciones más interesantes que posee el sistema
operativo y tampoco puede acceder a los puertos físicos (reales), sino que los emula usando otros
programas que ya están incluidos en su respectiva carpeta.
ORIGENES DEL LENGUAJE
Los procesadores Intel 8086 y 8088 fueron los primeros de 16 bits en tener
un conjunto de instrucciones conocido actualmente como x86. Fueron un
paso evolutivo en comparación con la generación anterior de CPUs de 8
bits, como el 8080 y heredaron muchas características e instrucciones, las
cuales fueron extendidas para trabajar con 16 bits.
El lenguaje ensamblador es el lenguaje de programación utilizado para escribir programas informáticos de bajo
nivel, y constituye la representación más directa del Código máquina específico para cada arquitectura de
computadoras legible por un programador. Aun hoy se utiliza en la programación de handler o manipuladores
de dispositivos de hardware.
¿Pre-requisitos para usar correctamente el lenguaje ensamblador?
La mayoría de los ensambladores x86 utilizan la sintaxis de Intel, como MASM, TASM,
NASM, FASM and YASM. GAS ha soportado ambas sintaxis desde la versión “2.10” a
través de la directiva “.intel_sintax”.
BA JO
E TR A
RN O D
ENTO
Pautas:
Para iniciar se debe ejecutar el archivo EMU886.exe, que se encuentra en la carpeta del mismo nombre, en el
directorio raíz; seguramente en la computadora donde corra el programa tendrá otras alternativas para activar
el programa, como un acceso directo en el escritorio o en el menú de programas del sistema operativo. Si
está ejecutando la versión 4.05 del EMU8086 observará primero la pantalla de Bienvenida (welcome),
similar a la que se muestra en la Figura.
Se presentan cuatro diferentes opciones para elegir:
• New: Le permite escribir un nuevo código en lenguaje ensamblador (al que Llamaremos “Código Fuente” y
tendrá extensión .ASM)
• Code examples: Le permite acceder a una serie de programas ejemplos que pueden ayudarle a comprender
funciones más complejas.
• Quick star tutor : activa un conjunto de documentos de ayuda, se recomienda revisarlos frecuentemente en caso
de dudas.
• Recent file: Le muestra los últimos archivos que se trabajaron en la máquina. Para continuar este primer
contacto con el emulador seleccione New. Observará una nueva caja de dialogo “choose code template”,como se
muestra en la Figura
Podrá ver una barra de menú de Windows con sus opciones file, edit, etc. pero también vera unas opciones poco usuales como
assembler, emulator, etc. propias del emulador. También vera una serie de botones que le permitirán crear un nuevo archivo
(new), abrir un ejemplo (examples), compilar un archivo fuente (compile), emular un archivo ejecutable (emulate) y otras
opciones que irá descubriendo a medida que se familiarice con el programa.
Características del entorno de trabajo
• 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.
• 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.
Operadores aritméticos y de desplazamiento
/ División
* Multiplicación
MOD (%) Módulo
SHL (<<) Desplazamiento hacia la izquierda
SHR (>>) Desplazamiento hacia la derecha
+ Suma
- Resta
OPERACIONES LÓGICAS
Las instrucciones lógicas realizan operaciones lógicas bit a bit con sus operandos.
Las instrucciones lógicas incluyen las operaciones que se realizan con los operadores “AND”, “OR” y “XOR”.
AND
and AL, BL al AND bl –> al
OR
or AL, BL al OR bl –> al
XOR
xor AL, BL al XOR bl –> al
NOT
Esta instrucción lógica consiste en negar cualquier otra instrucción invirtiendo sus valores.
FUNCIONES DE ENTRADA Y SALIDA
Son operaciones que mueven datos de un registro, desde y hacia un puerto; o de la memoria, desde y
hacia un puerto
INPUT Lectura desde un puerto de entrada
OUTPUT Escritura hacia un puerto de salida
La dirección de un puerto puede ser especificada de manera inmediata o a través del registro DX. Como
ejemplo de estas instrucciones tenemos in y out.
S DE
UR A
U CT
T R O L
ES O NT R
C
Secuencial: Condicional:
PROGRAM Mult; PROGRAM Mcd;
CONST CONST A := 51; B := 595;
VAR Num1, Num2, Resul :
Val1 = 35;
NATURAL.W;
Val2 = 58; BEGIN Num1 := A; Num2 := B;
VAR IF Num1 > 0 AND Num2 > 0
Mult1, Mult2 : WORD; THEN
Resul : DOUBLE WORD; BEGIN
WHILE Num1 <> Num2 DO
BEGIN
IF Num1 > Num2 THEN Num1 :=
Mult1 := Val1; Num1-Num2
Mult2 := Val2; ELSE Num2 := Num2-Num1;
Resul := 0; Resul := Num1
WHILE Mult1 > 0 DO BEGIN END;
Resul := Resul+Mult2;
Mult1 := Mult1-1;
END;
SENTENCIA IF-ELSE
¿Como hago un ’if/else’ en ensamblador?
1. if (a == 0) {
2. r = 1;
3. } else {
4. r = −1; 5
}
Para hacer un ’if’ en ensamblador va bien pensar el código en C y luego:
1. hacer un ’cmp’ de los dos operandos que comparamos pero al revés. Esto es porque en la sintaxis AT&T se compara
el segundo operador con el primero. Así que haríamos: línea 1 ’cmpl $0, a’. En C si uno de los dos operandos es una
constante se suele poner a la derecha. Lo que nos va perfecto porque recordad que el segundo operador no puede ser
inmediato (una constante).
2. Hacer el salto condicional con la condición para ir al ’else’. Si la condición del ’if’ es ’si son iguales’ la condición
para ir al ’else’ es ’si no son iguales’. Por lo tanto: línea 2 ’jne else’.
3. Poner el bloque ’then’: línea 3 ’movl $1, r’. (En C, el bloque ’then’ es el código que se ejecuta si la condición es
cierta)
4. Después del bloque ’then’ salto incondicional al final del ’if’: línea 4 ’jmp endif’.
5. Etiqueta del ’else’: línea 5 ’else:’.
SENTENCIA WHILE
¿Cómo hago un ’while’ en ensamblador?
1 i = 1;
2 while ( i <= 10) {
3 r = r+i ;
4 i++;
5}
Para hacer un bucle en ensamblador va bien pensar primero el código en C. En ensamblador a un bucle le llamaremos ’loop’.
Es más inmediato traducir un ’while’ a ensamblador que un ’for’. Cuando ya tenemos el ’while’ en C:
1. La inicialización de la variable contador ya la sabemos hacer: l´ınea 1 ’movl $1,%ecx’.
2. Empieza el bucle. Necesitaremos una etiqueta aqu´ı: línea 2 ’loop:’ (’while:’ también estaría bien).
3. hacer un ’cmp’ de los dos operandos que comparamos en la condición del ’while’ en C pero al revés. Esto es porque en la sintaxis
AT&T se compara el segundo operador con el primero. Así que haríamos: l´ınea 3 ’cmpl $10,%ecx’. Acordaros, que al igual que en el
caso del ’if’ en C si uno de los dos operandos es una constante se suele poner a la derecha. Lo que nos va perfecto porque en
ensamblador el segundo operador de una instrucción no puede ser inmediato (una constante).
4. Hacer el salto condicional al final del bucle con la condición de salida del bucle (que es la opuesta a la condición de permanencia
que aparece en el ’while’ en C). Si la condición de permanencia del ’while’ era ’i menor o igual que 10’ en ensamblador la condición
de finalizacion del ’loop’ sera ’%exc mayor que 10’. Por lo tanto: línea 4 ’jg endloop’.
Creación de Funciones
Una función es una parte de código que se puede llamar desde su programa a fin de hacer alguna tarea específica. Las funciones
hacen el programa más estructural y más fácil de entender. Generalmente las funciones devuelven al mismo punto en el que fueron
llamadas.
¿Cómo se declara una función?
La sintaxis para la creación de una función es muy sencilla.
• Nombre de la Función:
• Código de la función
• El final de la función
El nombre de la función puede ser cualquier palabra o conjunto de letras, siempre y cuando, dicho conjunto no esté dentro de las
palabras reservadas del lenguaje. Por ejemplo, no se puede usar como nombre de función "mov"
El código fuente de la función son las tareas que debe ejecutar la función. Pueden ser tantas como el programador considere
necesarias. El fin de la función depende del objetivo que tenga la misma. Puede ser un llamado a otra función o un ret para volver
al punto donde fue llamada la función o un hlt si se desea que el programa finalice tras ejecutar la función.
CONCLUSIONES