lunes, 23 de marzo de 2020
Mi segundo programa con emu8086
En nuestro segundo programa de emu8086 realizaremos un método donde imprimiremos un mensaje pero también se vera gráficamente mediante un cmd, como se muestra en la imagen.
Mi primer programa con mob8086
Empezaremos a realizar un pequeño programa donde moveremos varios registros de Ax a Bx o agregar el mismo dato en los dos como se muestra en la imagen.
miércoles, 18 de marzo de 2020
Obtención de cadena con representación decimal.
Obtención de cadena con representación decimal En este modo, los datos son proporcionados directamente como parte de la instrucción. Ejemplo: Mov AX,34h ;Copia en AX el número 34h hexadecimal Mov CX,10 ;Copia en CX el número 10 en decimal 2.12 Instrucciones lógicas AND Realiza la conjunción de los operandos bit por bit. Sintaxis: AND destino, fuente Con esta instrucción se lleva a cabo la operación "y" lógica de los dos operandos: Fuente Destino Resultado en operando destino 1 1 1 1 0 0 0 1 0 0 0 0 NEG Genera el complemento a 2 Sintaxis: NEG destino Genera el complemento a 2 del operando destino y lo almacena en este mismo operando. Ejemplo, si AX guarda el valor de –2 (FFFE), entonces: NEG AX Dejaría como resultado en AX el valor 0002. NOT Lleva a cabo la negación bit por bit del operando destino. Sintaxis: NOT destino El resultado se guarda en el mismo operando destino. OR OR inclusivo lógico Sintaxis: OR destino, fuente La instrucción OR lleva a cabo, bit por bit, la disyunción inclusiva lógica de los dos operandos: Fuente Destino Resultado en operando destino 1 1 1 1 0 1 0 1 1 0 0 0 TEST Compara logicamente los operandos Sintaxis: TEST destino, fuente Realiza una conjunción, bit por bit, de los operandos, pero a diferencia de AND esta instrucción no coloca el resultado en el operando destino, solo tiene efecto sobre el estado de las banderas. XOR OR exclusivo Sintaxis: XOR destino, fuente Su función es efectuar bit por bit la disyunción exclusiva lógica de los dos operandos.
En este modo, los datos son proporcionados directamente como parte de la instrucción.
Ejemplo:
Mov AX,34h ;
Copia en AX el número 34h hexadecimal Mov CX,10 ;
Copia en CX el número 10 en decimal
.COMMENT
Programa: PushPop.ASM
Descripción: Este programa demuestra el uso de las instrucciones para el manejo de la pila, implementando la instrucción XCHG con Push y Pop
MODEL tiny
.CODE
En este modo, los datos son proporcionados directamente como parte de la instrucción.
Ejemplo:
Mov AX,34h ;
Copia en AX el número 34h hexadecimal Mov CX,10 ;
Copia en CX el número 10 en decimal
.COMMENT
Programa: PushPop.ASM
Descripción: Este programa demuestra el uso de las instrucciones para el manejo de la pila, implementando la instrucción XCHG con Push y Pop
MODEL tiny
.CODE
Manipulación de la pila
La pila es un grupo de localidades de memoria que se reservan para contar con un espacio de almacenamiento temporal cuando el programa se está ejecutando.La pila es una estructura de datos del tipo LIFO (Last In First Out), esto quiere decir que el último dato que es introducido en ella, es el primero que saldrá al sacar datos de la pila.
Para la manipulación de la pila ensamblador cuenta con dos instrucciones especificas, las cuales son las siguientes:
Push:Esta instrucción permite almacenar el contenido del operando dentro de la última posición de la pila.
Pop:Esta instrucción toma el último dato almacenado en la pila y lo carga al operando.
Instrucciones aritmeticas
Dentro de ensamblador se pueden llevar a cabo las 4 instrucciones aritméticas básicas, cada una de ellas cuenta con su propia función:
Instrucción de Suma ADD:
Suma los operandos que se le dan y guarda el resultado en el primer operando.
Instrucción de Resta SUB:
Resta el primer operando al segundo y almacena el resultado en el primero.
Instrucción de multiplicación MUL:
Multiplica el contenido del acumulador por el operando, a diferencia de los métodos anteriores, solo es necesario indicar el valor por el que se multiplicará, ya que el resultado siempre es almacenado en el registro AX.
Instrucción de división DIV:
Divide un numero contenido en el acumulador entre el operando fuente, el cociente se guarda en AL o AX y el resto en AH o DX según el operando sea byte o palabra respectivamente. Es necesario que DX o AH sean cero antes de la operación por lo que es necesario utilizar el ajuste de división antes del la instrucción DIV.
Captura de cadenas con formato
El capturar cadenas con formato permite el movimiento, comparación o búsqueda rápida entre bloques de datos, las instrucciones son las siguientes:
MOVC:Esta instrucción permite transferir un carácter de una cadena.
MOVW:Esta instrucción permite transferir una palabra de una cadena.
CMPC:Este comando es utilizado para comparar un carácter de una cadena.
CMPW:Esta instrucción es utilizada para comparar una palabra de una cadena.
SCAC:Esta instrucción permite buscar un carácter de una cadena.
SCAW:Esta instrucción se utiliza para buscar una palabra de una cadena.
LODC:Esta instrucción permite cargar un carácter de una cadena.
LODW:Esta instrucción es utilizada para cargar una palabra de una cadena.
STOC:Esta instrucción permite guardar un carácter de una cadena.
Incremento y decremento
En ensamblador existen dos instrucciones que cumplen con el propósito de aumentar o reducir el valor contenido dentro de un registro.
INC:Incrementa en uno el valor contenido dentro del registro que se le dé como parámetro.
INC al: Aumenta en 1 el valor del registro al.
DEC:Reduce en uno el valor contenido dentro del registro que se le dé como parámetro.
DEC al: Reduce en 1 el valor del registro al.
Ciclos condicionales
Dentro de la programación existen ocasiones en la que es necesario ejecutar una misma instrucción un cierto número de veces, el cual no siempre es conocido por el programador o puede cambiar durante la ejecución del programa, para lo que existen los ciclos condicionales, los cuales una vez se cumpla la condición que tienen establecida, dejaran de ejecutarse como ciclo y permitirán que el programa continúe con su flujo normal.
En ensamblador no existen de forma predefinida estos ciclos, pero pueden crearse haciendo uso de los saltos incondicionales, generando ciclos que se repetirán hasta que se cumpla la condición definida por el programador.
Ejemplo:
mov al, 0: Asigna el valor cero al registro al.ciclo: Etiqueta a la que se hará referencia para el ciclo condicional.
INC al: Aumenta en 1 el valor del registro al.
CMP al, bl : Comparación entre el valor almacenado en al y el almacenado en bl.
JL ciclo: Instrucción que indica que el flujo del programa continuara desde la
ubicación de la etiqueta ciclo si el valor de al es menor al de bl.
Saltos
Los saltos son instrucciones que permiten al programador cambiar el orden de ejecución del programa según sea necesario, dentro de ensamblador existen dos tipos de salto principales: condicionales e incondicionales.
Saltos Incondicionales:
Los saltos incondicionales se utilizan mediante la instrucción JMP, la cual transfiere el control a la línea especificada después de la palabra JMP, la cual puede ser un valor directo o una etiqueta.
También se puede contar como un salto incondicional la instrucción CALL, la cual llama una procedimiento y al terminarla devuelve el control a la línea siguiente de donde se inicio la llamada a procedimiento, pero eso se ve con más detalle en la sección 3.1.
Ejemplo:
Salto: Etiqueta a la que se hará referencia para el salto incondicional.
Saltos Condicionales:
Los saltos condicionales transfieren el control del programa a la ubicación que se les dé como parámetro si al hacer una comparación se cumple la condición establecida en el salto, los saltos condicionales son los siguientes:
JA (Jump if Above):
Salta cuando el valor es superior, su condición es equivalente al salto JNBE (Jump if Not Below or Equal).
Comparación y pruebas
La comparación y prueba son instrucciones especiales con las que cuenta el microprocesador, estas son CMP y TEST respectivamente.
Comparación (CMP):
Esta instrucción compara los dos valores que se le den como parámetros y modifica las banderas de signo (SF), de cero (ZF) y de acarreo (CF) según sea necesario.
CMP ah,10h: Compara el valor almacenado en el registro ah con el valor 10 hexadecimal.
Prueba (TEST):
Verifica que los valores que se le introduzcan como parámetros sean iguales relizando la operación lógica AND, no almacena ningún resultado pero modifica banderas según sea necesario.

Instrucciones aritméticas.
Dentro de ensamblador se pueden llevar a cabo las 4 instrucciones aritméticas básicas, cada una de ellas cuenta con su propia función:
Instrucción de Suma ADD:
Suma los operandos que se le dan y guarda el resultado en el primer operando.
- ADD al, bl: Suma los valores guardados en los registros al y bl, almacenando el resultado en al.
Instrucción de Resta SUB:
Resta el primer operando al segundo y almacena el resultado en el primero.
SUB al, bl: Resta el valor de AL al de BL y almacena el resultado en AL.
MUL DX: Multiplica el valor del registro acumulador (AX) por el de DX.
Instrucción de división DIV:
Divide un numero contenido en el acumulador entre el operando fuente, el cociente se guarda en AL o AX y el resto en AH o DX según el operando sea byte o palabra respectivamente. Es necesario que DX o AH sean cero antes de la operación por lo que es necesario utilizar el ajuste de división antes del la instrucción DIV.
Captura básica de cadenas
El capturar cadenas con formato permite el movimiento, comparación o búsqueda rápida entre bloques de datos, las instrucciones son las siguientes:
MOVC:
Esta instrucción permite transferir un carácter de una cadena.
MOVW:
Esta instrucción permite transferir una palabra de una cadena.
CMPC:
Este comando es utilizado para comparar un carácter de una cadena.
CMPW:
Esta instrucción es utilizada para comparar una palabra de una cadena.
SCAC:
Esta instrucción permite buscar un carácter de una cadena.
SCAW:
Esta instrucción se utiliza para buscar una palabra de una cadena.
LODC:
Esta instrucción permite cargar un carácter de una cadena.
LODW:
Esta instrucción es utilizada para cargar una palabra de una cadena.
STOC:
Esta instrucción permite guardar un carácter de una cadena.
STOW:
Esta instrucción es utilizada para guardar una palabra de una cadena.
Ciclos numericos
Como en cualquier otro lenguaje de programación, hay ocasiones en las que es necesario hacer que el programa no siga una secuencia lineal, sino que repita varias veces una misma instrucción o bloque de instrucciones antes de continuar con el resto del programa, es para esto que se utilizan los ciclos.
Existen 5 tipos de ciclos predefinidos en ensamblador que son:
Existen 5 tipos de ciclos predefinidos en ensamblador que son:
LOOP:
Esta función decrementa el valor del registro contador CX, si el valor contenido en CX es cero ejecuta la siguiente instrucción, en caso contrario transfiere el control a la ubicación definida por la etiqueta utilizada al momento de declarar el ciclo.
LOOPE:
Esta función decrementa el valor del registro contador CX, si el valor contenido en CX es cero y ZF es diferente de uno ejecuta la siguiente instrucción, en caso contrario transfiere el control a la ubicación definida por la etiqueta utilizada al momento de declarar el ciclo.
LOOPNE:
Esta función decrementa el valor del registro contador CX, si el valor contenido en CX es cero y ZF es diferente de cero ejecuta la siguiente instrucción, en caso contrario transfiere el control a la ubicación definida por la etiqueta utilizada al momento de declarar el ciclo, esta es la operación contraria a loope
LOOPZ:
Esta función decrementa el valor del registro contador CX, si el valor contenido en CX es cero y ZF es diferente de uno ejecuta la siguiente instrucción, en caso contrario transfiere el control a la ubicación definida por la etiqueta utilizada al momento de declarar el ciclo.
LOOPNZ:
Esta función decrementa el valor del registro contador CX, si el valor contenido en CX es cero y ZF es diferente de cero ejecuta la siguiente instrucción, en caso contrario transfiere el control a la ubicación definida por la etiqueta utilizada al momento de declarar el ciclo, esta es la operación contraria a loopz.
Ensamblador (y ligado) a utilizar
Pasos para ensamblador y ligado.
1. El programa utiliza un editor de texto para crear un archivo de texto ASCII, conocido como archivo de código fuente.
2. El ensamblador lee el archivo de código fuete y produce un archivo de código objeto, una traducción del programa a lenguaje máquina. De manera opcional, produce un archivo de listado. Si ocurre un error, el programador debe regresar al paso 1 y corregir el programa.
3. El enlazador lee el archivo de código objeto y verifica si el programa contiene alguna llamada a los procedimientos en una biblioteca de enlace. El enlazador copia cualquier procedimiento requerido de la biblioteca de enlace, lo combina con el archivo de código objeto y produce el archivo ejecutable. De manera opcional, el enlazador puede producir un archivo de mapa.
4. La herramienta cargador (loader) del sistema operativo lee el archivo ejecutable y lo carga en memoria, y bifurca la CPU hacia la dirección inicial del programa, para que éste empiece a ejecutarse.

Emu8086
El emu8086 es un emulador del microprocesador 8086 (Intel o AMD compatible) con assembler integrado. A diferencia del entorno de programación en assembler utilizado anteriormente en la cátedra (MASM), este entorno corre sobre Windows y cuenta con una interfaz gráfica muy amigable e intuitiva que facilita el aprendizaje el leguaje de programación en assembler.
Dado que en un entorno emulado de microprocesador no es posible implementar una interfaz real de entrada/salida, el emu8086 permite interfacear con dispositivos virtuales y emular una comunicación con el espacio de E/S. Para esto, el emu8086 cuenta con una serie de dispositivos virtuales preexistentes en el software base, listos para ser utilizados, entre los que se encuentran una impresora, un cruce de calles con semáforos, un termómetro, un motor paso a paso, etc. No obstante, la cátedra ha desarrollado dispositivos adicionales con características particulares para la realización del segundo trabajo práctico.

Tabla comparativa con las diferencias entre el entorno de programación en assembler
Emu 8086
|
Microsoft Assembler (MASM 6.11)
|
Entorno educativo
|
Entorno para producción y educativo.
|
Basado en Windows
|
Basado en DOS
|
En forma nativa admite dispositivos virtuales.
|
No admite dispositivos virtuales en forma nativa
|
Set de instrucciones de 8086
|
Set de instrucciones del 8086, 80186/286/386/486
|
Directivas propias adicionales
|
Directivas comunes con TASAM (Borland Turbo Assembler)
|
Emula interrupciones por Hw y Sw
|
No permite emular interrupciones
|
Emula el espacio de E/S (instrucciones IN y OUT)
|
No permite emular el espacio de E/S
|
Permite emular interrupciones.
|
No permite emular intrrupciones.
|
Herramientas adicionales para el debug
|
miércoles, 11 de marzo de 2020
Desplegado de mensajes en el monitor
MENSAJES EN EL MONITOR
- Todos los gráficos y el texto que se muestran en el monitor se escriben en la RAM de visualización de video, para después enviarlos al monitor mediante el controlador de video. El controlador de video es en sí un microprocesador de propósito especial, que libera a la CPU principal del trabajo de controlar el hardware de video.
- Un monitor de pantalla de cristal líquido (LCD) digital directo recibe un flujo de bits digitales directamente desde el controlador de video, y no requiere del barrido de trama.
El controlador de video es en sí un microprocesador de propósito especial, que libera a la CPU pri

ncipal del trabajo de controlar el hardware de video.
Para hacer esto se pueden utilizar varios de los servicios con los que cuenta el lenguaje ensamblador, los cuales se describen con detalle en el apéndice A.
Para detener la pantalla y permitir al usuario ver lo que se ha desplegado en la misma se utiliza el servicio 00 de la interrupción 16h.
Ejemplo:
mov dx,65 -> Asignar el Valor 65 ASCII al registro DX
mov ah,02h -> Asignar el valor 02h al registro AH, que corresponde al servicio de impresión de un caracter.
int 21h -> Llamada a la interrupción 21h, de la que se ejecutará el servicio 02h.
Suscribirse a:
Comentarios (Atom)
Mi cuarto programa en emu8086
En este cuarto programa, se realizo un comparación de letras donde tenemos que obtener que la letra A debe ser mayor a B o a la inversa y el...
-
Como en cualquier otro lenguaje de programación, hay ocasiones en las que es necesario hacer que el programa no siga una secuencia lineal, s...
-
El proceso de ensamblado es el mismo sin importar el ensamblador que se está utilizando, aunque para las explicaciones se utilizara la sint...
-
En ensamblador existen dos instrucciones que cumplen con el propósito de aumentar o reducir el valor contenido dentro de un registro. INC...

