Programación en Assembler - Clase 1
Digital II
Presentación de Docentes y Material
Docentes:
Ing. Andrés Capalbo
Ing. Diego Alegrechi
Ing. Esteban Almirón
Material de Cátedra – Assembler (disponible en www.dsi.fceia.unr.edu.ar)
1. Escribiendo problemas en Assembler – Giandoménico
2. Conceptos básicos sobre la programación en Assembler – Ferradal
3. Guía de referencia rápida 80186 (Disponible en 2do Parcial)
4. Introducción al emu8086 (material para el TP2)
5. Documentación DVIO y emu8086 (material para el TP2)
6. Guía de problemas TP2 (material para el TP2)
Entorno de programación (emu8086)
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)
Traductores de lenguaje
Traductores de lenguaje
Cuando escribimos código en un lenguaje de programación (cualquiera), se requiere de un Traductor de lenguaje para que este código pueda ser entendido por una computadora.
Tradicionalmente los traductores se dividen es dos
clases:
Intérpretes (Ej: Basic, Bash, Pyton, JavaScript) que traducen cada
sentencia del código fuente (escrito en el lenguaje de programación) en instrucciones en código máquina que son ejecutadas inmediatamente.
Compiladores (Ej: C, C++, Pascal), que traducen todo el código fuente
directamente en instrucciones máquina para una determinada plataforma, denominado código objeto.
Los programas generados por un compilador tienden a requerir mucho menos espacio para su ejecución y se ejecutan mucho más rápidamente que los
Compiladores
Tipos de lenguajes compilados
de Alto Nivel: (C, Pascal) cada sentencia puede generar muchas instrucciones en lenguaje de máquina. Utiliza un compilador para traducir el código fuente a
lenguaje de máquina (técnicamente, código objeto).
de Bajo Nivel: (Assembler) codifican instrucciones simbólicas, cada una de las cuales genera una instrucción en lenguaje de máquina. Utiliza un ensamblador
para realizar la traducción al lenguaje de máquina.
Programación en Assembler
Ventajas:
– Más control sobre el manejo particular de los requerimientos de hardware (flexibilidad). – Genera módulos ejecutables más pequeños y compactos (eficiencia).
– Con mayor probabilidad tiene una ejecución más rápida (velocidad).
Desventajas:
– Se requiere conocimientos acerca del Hardware (arquitectura) de la computadora, su conjunto de instrucciones y sus reglas de uso Falta de portabilidad
Compiladores (cont.)
Una práctica común es combinar los beneficios de ambos niveles de programación, se puede codificar el grueso de un proyecto en un lenguaje de alto nivel y los módulos
críticos (aquellos que provocan notables retardos) en lenguaje Assembler.
El Proceso de Construcción de un archivo ejecutable
1. Ensamblar (Assembling): consiste en la traducción del código fuente en código objeto y la generación de un archivo intermedio .OBJ (objeto), o módulo. El ensamblador crea un
encabezado al principiop del módulo .OBJ generado; parte del encabezado tiene información acerca de direcciones incompletas. El módulo .OBJ aún no está en forma ejecutable.
2. Enlazar (Linking): implica convertir el módulo .OBJ en un módulo de código de máquina .EXE (ejecutable). Una de las tareas del enlazador es combinar los programas ensamblados en forma separada en un módulo ejecutable.
Archivo Fuente 1 (.ASM) Archivo Fuente 2 (.C) Ensamblador Compilador Archivo Objeto 1 (.OBJ) Archivo objeto 2 (.OBJ) Archivo Objeto 3 (.OBJ)
Arquitectura del 8086
Unidad de Ejecución (EU)
Registros de uso general:
A, B, C, D, SP, BP, SI, DI todos de 16 Bits.
FLAGS: es un registro de 16 bits, cada uno de los cuales representa una determinada condición.
Unidad de Interface con el Bus (BIU)
4 registros de segmentos CS, DS, SS, ES (de 16 bits).
1 registro de contador de programa (instrucción pointer).
12/10/2011 8
El registro de FLAGS
(Processor Status Word)
AF: carry o borrow entre los 4
bits menos significativos.
CF: carry o borrow desde el
bit más significativo.
OF: cuando se produce
overflow cuando se exceda la capacidad de representación.
SF: bit de signo (0=positivo y
1=negativo)
PF: paridad del resultado
(1=paridad impar, 0=paridad par).
ZF: resultado cero
DF: utilizado cuando se opera
con strings
IF: interrupción presente TF: modalidad especial de
Sintaxis de una instrucción de ASS
El formato de una sentencia de instrucción es el siguiente:
Corchetes: indican que lo especificado entre ellos es opcional.
Campo de etiqueta: Es el nombre simbólico de la primera posición de una
instrucción, puntero o dato; permite identificarla unívocamente.
Campo de nombre: Contiene el mnemónico de la instrucción (sigla que representa
el código de la instrucción).
Campo de operandos: Indica cuales son los datos implicados en la operación.
Campo de comentarios: Cuando en una línea hay un punto y coma (;) todo lo
que sigue en la línea es un comentario.
Existen tres tipos de sentencias:
Instrucciones: se aplican en tiempo de ejecución.
Directivas: sólo son utilizadas durante el ensamblaje, condicionando la forma de actuar del ensamblador, sin generar código de máquina.
Instrucciones de movimiento de datos
MOV (transferencia)
Sintaxis:
MOV destino, origen
Transfiere datos de longitud byte o word del operando origen
al operando destino.
Los operandos origen y destino pueden ser:
registros (8 o 16 bits)
posiciones de memoria
inmediato (constante 0-FFFFh); sólo operando origen.
Restricciones:
Ambos operandos de igual dimensión.
No se permite que ambos operandos sean posiciones de memoria.
- NO MODIFICA X MODIFICA ? INDEFINIDO
Instrucciones aritméticas
ADD (suma) y SUB (resta)
Sintaxis:
ADD (SUB) destino, origen
Realiza la operación destino +/- origen, almacenando el
resultado en el operando destino.
Los operandos origen y destino pueden ser:
registros (8 o 16 bits)
posiciones de memoria
inmediato (constante 0-FFFFh); sólo operando origen.
Restricciones:
Ambos operandos de igual dimensión.
No se permite que ambos operandos sean posiciones de memoria.
- NO MODIFICA X MODIFICA ? INDEFINIDO
Instrucciones aritméticas (cont.)
INC (incrementar) y DEC (decrementar)
Sintaxis:
INC (DEC) destino
Suma (resta) una unidad del operando destino, tratándolo como un
número binario sin signo.
El operando puede ser byte o palabra.
Obsérvese que estas instrucciones no modifican el bit de acarreo (CF) y no es posible detectar un desbordamiento por estos procedimientos (utilícese ZF).
Ejemplo: INC ax
ESTADO INICIAL: ax=22h(34d)
ESTADO POSTERIOR: ax=23h(35d)
- NO MODIFICA X MODIFICA ? INDEFINIDO
Flags: OF DF IF TF SF ZF AF PF CF
Instrucciones aritméticas (cont.)
NEG (negación)
Sintaxis:
NEG destino
Calcula el valor negativo en complemento a dos del operando y
devuelve el resultado en el mismo operando.
Ejemplo: NEG al
ESTADO INICIAL: al=00100010b(34d)
ESTADO POSTERIOR: al=11011110b
- NO MODIFICA X MODIFICA ? INDEFINIDO
Instrucciones lógicas
NOT (no lógico)
Sintaxis:
NOT destino
Realiza el complemento a uno del operando destino, invirtiendo
cada uno de sus bits. Los flags no resultan afectados.
Ejemplo: NOT al
ESTADO INICIAL: al=00100010b
ESTADO POSTERIOR: al=11011101b
- NO MODIFICA X MODIFICA ? INDEFINIDO
Instrucciones lógicas (cont.)
AND (y lógico) OR (O lógico) XOR (O exclusivo)
Sintaxis:
AND(OR)(XOR) destino, origen
Realiza una operación de and(or)(or-EXCLUSIVA) lógico entre el
operando origen y destino quedando el resultado en el destino.
Admite operandos byte o palabra, pero ambos del mismo tipo. Ejemplo: AND al,bl
ESTADO INICIAL: al=10111101b, bl=10001010b (máscara)
ESTADO POSTERIOR: al=10001000b, bl=10001010b
- NO MODIFICA X MODIFICA ? INDEFINIDO
Instrucciones lógicas (cont.)
SAL/SHL (desplazamiento aritmético a la izquierda)
Sintaxis:
SAL/SHL destino, contador
Desplaza a la izquierda los bits del operando el número de bits especificado en el segundo operando. Los bits que ingresan por la derecha son ceros. Mientras el OF esté en cero el signo se mantiene.
El segundo operando que debe ser CL o un inmediato (constante de 8 bits).
SHR (desplazamiento lógico a la derecha)
Sintaxis:
SHR destino, contador
Desplaza a la derecha los bits del operando destino el número de los bits especificados en el segundo operando. Los bits de la izquierda se llenan con cero. El número de bits a desplazar se puede
Instrucciones lógicas (cont.)
SAR (desplazamiento aritmético a la derecha)
Sintaxis:
SAR destino, contador
Desplaza a la derecha los bits del operando destino el número de bits especificado en el segundo operando. Los bits de la izquierda se rellenan con el bit de signo del primer operando. El número de bits a desplazar se puede especificar directamente a través de un
Instrucciones lógicas (cont.)
TEST (comparación lógica)
Sintaxis:
TEST destino, origen
Realiza una operación Y lógica entre los dos operandos pero sin almacenar el resultado. Los flags son afectados con la operación.
CMP (comparación)
Sintaxis:
CMP destino, origen
Realiza la resta destino-origen sin alterar el contenido de destino ningún resultado. Los operandos quedan inalterados, pero los flags pueden ser consultados mediante instrucciones de salto condicional. Los operandos pueden ser de tipo byte o palabra pero ambos de la misma dimensión.
Instrucciones de salto
Salto incondicional: JMP (salto)
Sintaxis:
JMP dirección
Transfiere el control incondicionalmente a la dirección indicada en el operando.
No modifica ningún Flag.
Ejemplo: etiqueta:
....
jmp etiqueta
Salto condicional: J
xx
(
xx
condición)
Sintaxis:
J
xx
dirección
Transfiere el control a la dirección indicada en el operando
Instrucciones de salto (cont.)
Saltos condicionales
Instrucción Descripción
JA/JNBE Salto si mayor (above), si no menor o igual (not below or equal), si CF=0 y ZF=0.
JAE/JNB Salto si mayor o igual (above or equal), si no menor (not below), si CF=0. JB/JNAE/JC Salto si menor (below), si no superior ni igual (not above or equal), si
acarreo, si CF=1.
JBE/JNA Salto si menor o igual (not below or equal), si no mayor (not above), si CF=1 ó ZF=1.
JCXZ Salto si CX=0.
JE/JZ Salto si igual (equal), si cero (zero), si ZF=1.
JG/JNLE Salto si mayor (greater), si no menor ni igual (not less or equal), si ZF=0 y SF=OF.
Instrucciones de salto (cont.)
Saltos condicionales
Instrucción Descripción
JLE/JNG Salto si menor o igual (less or equal), si no mayor (not greater), si ZF=1 y SF=/OF.
JNC Salto si no acarreo, si CF=0.
JNE/JNZ Salto si no igual, si no cero, si ZF=0. JNO Salto si no desbordamiento, si OF=0. JNP/JPO Salto si paridad impar, si PF=0.
JNS Salto si no signo, si positivo, si SF=0. JO Salto si desbordamiento, si OF=1. JP/JPE Salto si paridad par, si PF=1.
Instrucción de gestión de bucles
LOOP (bucle)
Sintaxis:
LOOP etiqueta
Decrementa el registro contador CX; si CX es cero, ejecuta la siguiente
instrucción, en caso contrario transfiere el control a la dirección