viernes, 12 de junio de 2020

PROGRAMA EN EMU8086



PRIMER PROGRAMA EN EMU8086

Este código son para los registros y para las interrupciones 

jueves, 11 de junio de 2020

2.9 INSTRUCCIONES ARITMETICAS

INSTRUCCIONES ARITMÉTICAS



SUMA SIN ACARREO:
Consiste en sumar al contenido del registro “A” un número y obtener el resultado en el registro “A”. El indicador de acarreo no se tiene en cuenta para esta operación. Su esquema sería:
SUMA CON ACARREO:
Exactamente igual que la anterior, pero se suma también el indicador de acarreo del registro “F”. De esta forma, sepuede incluir en la suma el acarreo procedente de una suma anterior. Su esquema sería:
RESTA SIN ACARREO:
Consiste en restar un número del contenido del registro “A”, y obtener el resultado en este mismo registro. El indicador de acarreo no interviene en la operación. Se consideran números negativos los superiores a 127 (7Fh) es decir, el número 255 (FFh) se considera “-1”, el 254 (FEh) se considera “-2” y así sucesivamente, hasta 128 (80h) que se considera “-128”. El paso de 127 a 128 o viceversa se indica poniendo a “1” el flag de “overflow” (P/V) del registro “F”. Su esquema sería:
RESTA CON ACARREO:
Igual que el anterior, salvo que también se resta el indicador de acarreo (CF) del registro “F”. Su esquema sería:
INCREMENTO:
Consiste en sumar uno al contenido de un registro que se especifica en la instrucción. Su esquema es:
Donde “R” representa un registro cualquiera de 8 a 16 bits. Si se trata de un registro doble (de 16 bits) se incrementa el registro de orden bajo (por ejemplo, en el “BC” se incrementa “C”), y si ello hace que este pase a valer “0”, se incrementa también el de orden alto.
DECREMENTO:
Es la inversa de la anterior, consiste en restar uno al contenido de un registro. Su esquema es:
Si se trata de un registro doble, se decrementa el de orden bajo y, si esto hace que pase a valer 255 (FFh), se decrementa también el de orden alto.
Si el registro incrementado o decrementado es de 8 bits, resultan afectados los indicadores del registro “F”.
COMPLEMENTO:
Consiste en realizar un “complemento a 1” del acumulador, es decir, cambiar los “unos” por “ceros” y los “ceros” por “unos”.
NEGACIÓN:
Consiste en realizar un “complemento a 2” del acumulador, es decir, realizar un “complemento a 1” y, luego, sumarle “1”. Lo que se obtiene es el “negativo” del número que teníamos en el acumulador. El efecto es el mismo que si restáramos el acumulador de “cero”, es decir:
INSTRUCCIONES LOGICAS
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 instruccion logica consiste en negar cualquier otra instruccion invirtiendo sus valores.
Las instrucciones lógicas de dos operandos (and, or y xor) ponen siempre a ‘0’ los bits CF y OF de registro de estado después de ejecutarse (debe tenerse en cuenta que el estado de estos bits sólo tiene significado tras la ejecución de las instrucciones aritméticas). Los bits SF y ZF se modifican siguiendo los mismos criterios que en las instrucciones aritméticas.
La instrucción lógica de un operando (not) no modifica ningún bit del registro de estado tras su ejecución.
 INSTRUCCIONES DE DESPLAZAMIENTO
Las instrucciones de desplazamiento son cuatro: shl, shr, sar y sal; y su objetivo es desplazar los bits de un operando un determinado número de posiciones a la izquierda o a la derecha.La estructura de los operandos manejados por estas instrucciones y su significado es idéntico para las cuatro instrucciones. Todas ellas trabajan sobre un operando fuente y un operando destino.
El Operando Destino contiene el dato que va a ser objeto del desplazamiento y debe ser del tipo, registro o memoria.
El Operando Fuente determina la cantidad de posiciones que va a ser desplazado el operando destino. El operando fuente sólo puede ser un dato inmediato de 8 bits (I8) o bien el registro CL.
SHL (Shift Left = desplazamiento a la izquierda)
Se desplazan a la izquierda los bits del operando destino tantas posiciones como indique el operando fuente. El desplazamiento de una posición se realiza de la siguiente forma: el bit de mayor peso del operando se desplaza al bit CF del registro de estado, el resto de los bits se desplazan una posición hacia la izquierda, y la posición de menor peso se rellena con un 0. Este proceso se representa en la figura siguiente.
SHR (Shift Right = desplazamiento a la derecha)
La instrucción shr funciona de la misma forma que shl, pero desplazando los bits a la derecha en lugar de a la izquierda, tal y como se muestra en la figura siguiente.
SAR (Shift Arithmetic Right = desplazamiento aritmético a la derecha)
Esta instrucción desplaza los bits del operando destino a la derecha tantos bits como indique el operando fuente. Esta forma de funcionamiento es similar a la de la instrucción shr; sin embargo, ambas instrucciones se diferencian en que sar, en vez introducir ceros por la izquierda del operando, replica el bit de mayor peso (bit de signo) en cada desplazamiento. esquemáticamente, la instrucción sar trabaja de la siguiente forma:
El desplazamiento a la derecha realizado por la instrucción sar recibe el nombre de aritmético porque sirve para dividir un operando entre una potencia entera de 2.
El desplazamiento aritmético a la derecha de un operando (considerado con signo) n posiciones equivale a la división entera del operando entre 2n.
SAL (Shift Arithmetic Left = desplazamiento aritmético a la izquierda)
El objetivo de un desplazamiento aritmético a la izquierda es multiplicar un operando, interpretado con signo, por una potencia de 2.
Para llevar a cabo este tipo de desplazamiento, hay que desplazar los bits del operando hacia la izquierda introduciendo ceros por su derecha. En realidad, este tipo de desplazamiento es idéntico al llevado a cabo por la instrucción shl; por tanto, sal y shl son, de hecho, la misma instrucción y se codifican con el mismo código máquina.
INSTRUCCION DE ROTACION DE BITS (Con o sin Acarreo)
RCL DESTINO,CONTADOR ;Rota destino a traves de carry a la izquierda contador veces
RCR DESTINO,CONTADOR ;Rota destino a traves de carry a la derecha contador veces
ROL DESTINO,CONTADOR ;Rota destino a la izquierda contador veces
ROR DESTINO,CONTADOR ;Rota destino a la derecha contador veces
SAL DESTINO,CONTADOR ;Desplaza destino a la izquierda contador veces y rellena con ceros
SAR DESTINO,CONTADOR ;Desplaza destino a la derecha contador veces y rellena con bit SF
SHR DESTINO,CONTADOR ;Desplaza destino a la derecha contador veces y rellena con ceros
NOTA: El DESTINO va a ser la direccion y el CONTADOR es el numero de veces que se reètira la instruccion.
 INSTRUCCIONES PARA MANEJO DE PILA
POP (Extraer de la Pila)
Sintaxis: POP Destino
Indicadores: OF DF IF TF SF ZF AF PF CF
Transfiere el elemento palabra que se encuentra en lo alto de la pila (apuntado por SP) al operando destino que a de ser tipo palabra, e incrementa en dos el registro SP. La instrucción POP CS, poco útil, no funciona correctamente en los 286 y superiores.
Ejemplos:
pop ax
pop pepe
PUSH (Introduce en la Pila)
Sintaxis: PUSH origen
Indicadores: OF DF IF TF SF ZF AF PF CF
Decrementa el puntero de pila (SP) en 2 y luego transfiere la palabra especificada en el operando origen a la cima de la pila. El registro CS aquí sí se puede especificar como origen, al contrario de lo que afirman algunas publicaciones.
Ejemplo:
push cs
POPF (Extrae los Indicadores de la Pila)
Sintaxis: POPF
Indicadores: OF DF IF TF SF ZF AF PF CF
x x x x x x x x x
Traslada al registro de los indicadores la palabra almacenada en la cima de la pila; a continuación el puntero de pila SP se incrementa en dos.
PUSHF (Introduce los Indicadores en la Pila)
Sintaxis: PUSHF Indicadores: OF DF IF TF SF ZF AF PF CF
Decrementa en dos el puntero de pila y traslada a la cima de la pila el contenido de los indicadores.
DIFERENCIA ENTRE PROGRAMAS .COM y .EXE
Un programa .COM es prácticamente una imagen en memoria del archivo en disco, menos por el PSP que es creado durante el proceso de inicialización, y es por esta razón que el programa se inicia a partir del offset 0x100 (en assembler se utiliza el operador ORG).
En cambio el formato .EXE reorganiza sus segmentos en la memoria dando un tamaño adecuado (que es posible y necesario que el programador lo determine, dependiendo del lenguaje en el cual fue escrito), es por esta razón que dentro de la cabecera de un archivo .EXE hay cierto código que realiza esta tarea.
TIPOS DE INTERRUCCIONES
Interrupción 21H
Propósito: Llamar a diversas funciones del DOS.
Funciones para desplegar información al video 02H Exhibe salida
09H Impresión de cadena (video)
40H Escritura en dispositivo/Archivo
Funciones para leer información del teclado 01H Entrada desde teclado
0AH Entrada desde teclado usando buffer
3FH Lectura desde dispositivo/archivo
Método FCB
0FH Abrir archivo
14H Lectura secuencial
15H Escritura secuencial
16H Crear archivo
21H Lectura aleatoria
22H Escritura aleatoria
Handles
3CH Crear archivo
3DH Abrir archivo
3EH Cierra manejador de archivo
3FH Lectura desde archivo/dispositivo
40H Escritura en archivo/dispositivo
42H Mover apuntador de lectura/escritura en archivo
Función 02H
Despliega un caracter a la pantalla.
Función 09H 
Despliega una cadena de carateres en la pantalla.
Función 01H
Leer un c
DIFERENCIA ENTRE COMPILADORES Y ENSAMBLADORES
Los COMPILADORES como los desarrollados para Fortran, Clipper, COBOL, Pascal o C, que en vez de llamar y ejecutar una rutina en lenguaje de máquina, éstos juntan esas rutinas para formar el código objeto que, después de enlazar las rutinas de run-time y llamadas a otros programas y servicios del sistema operativo, se transformará en el programa ejecutable.
Los ENSAMBLADORES son como una versión reducida y elemental de un compilador (pero que de ninguna manera deben considerarse como tales), ya que lo único que tienen que hacer es cambiar toda referencia simbólica por la dirección correspondiente, calcular los saltos, resolver referencias y llamadas a otros programas, y realizar el proceso de enlace. Los ensambladores son programas destinados a realizar el ensamblado de un determinado código.
 REQUERIMIENTO DEL LENGUAJE ENSAMBLADOR
  • Software Necesario
  • Utilización del MASM
  • Uso del Enlazador (LINKER)

DETERMINAR SI UN NUMERO ES MAYOR O MENOR

DETERMINAR SI UN NUMERO ES MAYOR O MENOR



Este seria el código para determinar si un numero es mayor o menor que otro.

miércoles, 18 de marzo de 2020

EMU8086

EMU 8086

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 lenguaje 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.
Se muestra a continuación una tabla comparativa con las diferencias entre el entorno de programación en assembler utilizado anteriormente en la cátedra (MASM 6.11) y el nuevo emu8086:





COMO INSTALAR EMU8086





INTERFAZ DEL EMULADOR



martes, 17 de marzo de 2020

2.7 INCREMENTO Y DECREMENTO

2.7 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.




2.6 CICLOS CONDICIONALES

2.6 CICLOS CONDICIONALES

Sintaxis:

 LOOP etiqueta La instrucción loop decrementa CX en 1, y transfiere el flujo del programa a la etiqueta dada como operando si CX es diferente a 1. 

Instrucción LOOPE Propósito: Generar un ciclo en el programa considerando el estado de ZF 

Sintaxis: 

LOOPE etiqueta Esta instrucción decrementa CX en 1. Si CX es diferente a cero y ZF es igual a 1, entonces el flujo del programa se transfiere a la etiqueta indicada como operando. 

Instrucción LOOPNE Propósito: Generar un ciclo en el programa, considerando el estado de ZF 


Sintaxis:

 LOOPNE etiqueta Esta instrucción decrementa en uno a CX y transfiere el flujo del programa solo si ZF es diferente a 0. 

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.
Resultado de imagen para Ciclos condicionales asm

2.5 SALTOS

2.5 SALTOS

La mayoría de los programas constan de varios ciclos en los que una serie de pasos se repite hasta alcanzar un requisito específico y varias pruebas para determinar qué acción se realiza de entre varias posibles. 

Una instrucción usada comúnmente para la transferencia de control es la instrucción JMP (jump, salto, bifurcación). Un salto es incondicional, ya que la operación transfiere el control bajo cualquier circunstancia. También JMP vacía el resultado de la instrucción previamente procesada; por lo que, un programa con muchas operaciones de salto puede perder velocidad de procesamiento. 

La instrucción LOOP, requiere un valor inicial en el registro CX. En cada iteración, LOOP de forma automática disminuye 1 de CX. Si el valor en el CX es cero, el control pasa a la instrucción que sigue; si el valor en el CX no es cero, el control pasa a la dirección del operando. La distancia debe ser un salto corto, desde -128 hasta +127 bytes. Para una operación que exceda este límite, el ensamblador envía un mensaje como "salto relativo fuera de rango".

EJEMPLO

El código es el siguiente


1.- Definamos el modelo de memoria, en este caso SMALL
2.- Definimos la pila en memoria
3.-DATA para permitir declarar nuestros datos
4 y 5.- Definimos variables
6.- Indicamos inicio de código
7.- Etiqueta de inicio
8.- Transfiere 10 a AX
9.-Transfiere 10 a BX
10.- Es AX=BX
11.- Si SI saltar a la etiqueta igual
12.-NO, entonces imprimir cad2
13.-Transfiere AH el valor 09h
14.- Saltar a la etiqueta salir
Nuestro proceso de ensamblador es el siguiente: