presentación de lenguaje ensamblador.ppt

34
Introducción al Lenguaje Ensamblador

Upload: mario-padilla

Post on 04-Dec-2015

215 views

Category:

Documents


0 download

TRANSCRIPT

Introducción al Lenguaje Ensamblador

VENTAJAS DE LENGUAJE ENSAMBLADOR

Velocidad Eficiencia de tamaño

Flexibilidad

DESVENTAJAS

Tiempo de programación Programas fuente grandes

Peligro de afectar recursos inesperadamente Falta de portabilidad

ARQUITECTURA INTERNA DEL MICROPROCESADOR

                                                                                                                                                                                           

EXISTEN 4 REGISTROS SEGMENTOS

DS: Data Segment (Segmento de Datos)

Este registro selecciona una sección de 64 Kb. que se dedica generalmente a colocar en ella nuestras variables, por lo cual toma su nombre: sección de memoria dedicada a datos.

CS: Code Segment (Segmento de Código)

Este registro selecciona el área de 64 Kb. que generalmente dedicamos al código. En este caso, el CPU (específicamente, el BIU), siempre toma las instrucciones de esta región de memoria; por lo que cuando requerimos más de 64 Kb. de código (instrucciones), este registro tendrá que moverse, tomando distintos valores según recorremos distintas regiones de memoria.

SS: Stack Segment (Segmento de Pila)

Este registro selecciona la región de 64 Kb. que va a contener la pila del sistema. Como su nombre lo indica, tendremos una estructura de datos, con política LIFO (Last In, First Out = El último elemento en entrar, es el primero en salir), con instrucciones básicas PUSH y POP para su manejo. Esta estructura es usada por los programas de aplicación, pero también por el procesador para el control de instrucciones que lo requieren, tales como las llamadas a subrutinas y la atención de interrupciones.

ES: Extra Segment (Segmento Extra)

Este registro nos permite seleccionar una sección de 64 Kb., que no está destinada a ningún uso específico; por lo que el programador puede aplicarla como comodín, generalmente como un segundo segmento de datos; o bien, para el acceso a regiones de memoria del sistema, tales como la memoria de video o las variables del BIOS.

UNIDAD DE CONTROL

Es la sección del procesador que contiene la lógica de funcionamiento del mismo; es decir, esta circuitería

gobierna el comportamiento de los distintos elementos en el procesador, coordinando los procesos , así como las

distintas microoperaciones necesarias para la ejecución. Por tanto, tiene dos funciones principales:

Generar la secuencia de estados del procesador, lo que logra gracias a la ejecución del microcódigo.

Decodificar las instrucciones, determinando así los pasos para su ejecución.

REGISTROS DE PROPOSITO GENERAL

• AX: Registro de acumulador • Este registro es el más usado, siendo de

propósito general; y tiene ciertas especializaciones, de ahí su nombre:

• Es el único que puede ser usado como multiplicando en la multiplicación

• Es el único que puede ser usado como dividendo en la división

• Es el parámetro que selecciona los distintos servicios del Sistema Operativo, usados mediante el mecanismo de Interrupciones.

• BX: Registro de Base

• Este registro, además de las características generales de los registros de propósito general, se especializa

• en el acceso a memoria en combinación con los registros de índice, especialmente para el manejo de arreglos.

REGISTROS DE PROPOSITO GENERAL

• CX: Registro de Contador • Este registro, como su nombre indica, será

ampliamente usado como contador. Puede ser usado como cualquier registro de propósito general, pero tiene capacidades especiales para ser usado en instrucciones:

• de manejo de ciclos • como contador en los corrimientos • de manejo de memoria y strings

REGISTROS DE PROPOSITO GENERAL

• DX: Registro de Datos • Este registro de propósito general tiene como

especializaciones: • Formar con AX números de 32 bits, siendo en

este caso la parte más significativa. • El acceso a puertos. Las instrucciones IN y

OUT, que permiten dicho acceso, requerirán en ciertos casos que el número de puerto esté en DX.

REGISTROS DE PROPOSITO GENERAL

REGISTROS INDICES

• No pueden conectarse directamente con los registros de segmentos.

• No pueden verse como dos registros de 8 bits (parte alta y parte baja).

SI: Source Index, o Apuntador a la Fuente Este registro se especializa en el acceso a bytes o words dentro del segmento de datos; existen instrucciones que lo toman por defecto como el registro que apunta a una localidad de memoria que se va a leer, por lo cual toma su nombre. DI: Destination Index, Apuntador al Destino Este registro se especializa en el acceso a bytes o words dentro del segmento de datos o el extra; existen instrucciones que lo toman por defecto como el registro que en combinación con el ES apunta a una localidad de memoria que se va a escribir, por lo cual toma su nombre.

REGISTROS DE PILA• BP: Base Pointer, o apuntador a la Base de la Pila. • Este registro es usado para accesar, dentro del segmento de pila, la

información. Principalmente nos permite determinar cuando hay un underflow, es decir, cuando se quiere sacar más información de la pila que la que se ha colocado en ella; y el acceso a variables locales y parámetros.

• SP: Stack Pointer, o apuntador al tope de la Pila. • Este registro también está siempre asociado al manejo de la pila.

Su función especial es marcar el tope de la pila, y por tanto, indica en qué localidad de memoria se localiza la información de la pila; se incrementa cuando se hace un POP, con lo que apunta al siguiente elemento en la pila; y se decrementa al hacer un PUSH, con lo que controla el acceso a la memoria de la pila.

ALU: UNIDAD ARITMETICO LOGICA

Este componente, como su nombre indica, contiene la circuitería necesaria para realizar las diversas operaciones aritméticas y lógicas. Recibe sus operandos por el Bus A, y genera los resultados regresándolos al mismo bus. Una particularidad que es importante recalcar es su conexión al registro de banderas, por lo cual todas las operaciones aritméticas y lógicas, de acuerdo a su resultado, lo alterarán.

BANDERAS

• ZF: Bandera de resultado 0 • Se prende cuando el resultado de la última operación

realizada en el ALU fue un 0. • CF: Bandera de carry • Se prende cuando el resultado de la última operación

realizada en el ALU (necesariamente, una suma o resta) generó un carry o un borrow.

• OF: Bandera de overflow • Se prende cuando el resultado de la última operación

realizada en el ALU excedió la capacidad del registro donde se almacena (overflow).

• SF: Bandera de signo • Se prende cuando el resultado de la última operación

realizada en el ALU fue negativo, según la representación de complemento a 2 q

• AF: Bandera de carry auxiliar • Se prende cuando el resultado de la última operación

realizada en el ALU generó un carry cuando estaba a la mitad. Por ejemplo, si sumamos dos números de 16 bits, nos indicará si la suma de las partes bajas (primeros 8 bits) había generado carry; si sumamos dos números de 8 bits, indica si el resultado intermedio después de sumar los 4 bits menos significativos, generó carry para sumarse a los bits 5.

BANDERAS

• DF: Bandera de dirección • A diferencia de las anteriores, esta bandera no se prende como

resultado del ALU, sino que el programador la usa para controlar la dirección del acceso mediante apuntadores, especialmente en las instrucciones de strings.

• IF: Bandera de interrupción • Se prende cuando el procesador es interrumpido, y está ejecutando

una rutina de atención de interrupción. Esto evita que el procesador acepte interrupciones mientras está procesando interrupciones previas, de manera que no se pierda el control del procesador.

BANDERAS

MODOS DE DIRECCIONAMIENTO

Direccionamiento implícito

Depende solamente de la instrucción, es decir, la instrucción no lleva parámetros. Particularmente en instrucciones que no accesan memoria, o bien que tienen una forma específica de accesarla. Ejemplos: PUSHF, POPF, NOP

MODOS DE DIRECCIONAMIENTO

Modo registro

Usa solamente registros como operandos Es el más rápido, pues minimiza los recursos necesarios (toda la información fluye dentro del EU del CPU)

Ejemplo: MOV AX, BX

MODOS DE DIRECCIONAMIENTO

Modo inmediato

Tiene dos operandos: un registro y una constante que se usa por su valor. El valor constante no se tiene que buscar en memoria, pues ya se obtuvo al hacer el "fetch" de la instrucción. Por tanto, es rápido aunque no tanto como el modo registro; requiere ir al BIU por el dato. Ejemplo: MOV AH, 9

MODOS DE DIRECCIONAMIENTO

Modo directo

Uno de los operandos involucra una localidad específica de memoria El valor constante se tiene que buscar en memoria, en la localidad especificada. Es más lento que los anteriores, pero es el más rápido para ir a memoria, pues ya "sabe" la localidad, la toma de la instrucción y no la tiene que calcular.

Ejemplo: MOV AH, [0000] MOV AH, Variable

MODOS DE DIRECCIONAMIENTO

Modo indirecto

Se usan los registros SI, DI como apuntadores El operando indica una localidad de memoria, cuya dirección (sólo la parte desplazamiento) está en SI o DI. Es más lento que los anteriores, pues tiene que "calcular" la localidad

Ejemplos: MOV AL, [SI] MOV BL, ES:[SI] ; Aquí se dice que se usa un "segment override", donde se indica que en vez de usar el segmento de datos por defecto, se use en su lugar como referencia el segmento extra.

MODOS DE DIRECCIONAMIENTO

Modo indexado de base

Formato: [BX o BP+ SI o DI (opcionales)+ constante (opcional)] BX o BP indica una localidad base de la memoria A partir de BX o BP, se puede tener un desplazamiento variable y uno constante La diferencia es el segmento sobre el que trabajan por defecto: BX por defecto en el segmento de datos BP por defecto en el segmento de pila.

Ejemplos: MOV AX, [BX] MOV DX, [BX+2] MOV CX, [BX+DI] MOV DL, [BX+SI+3]

Instrucciones aritméticas:

Instrucción Operandos Función equivalente en "C"

Resultados

ADD op1, op2 op1 = op1 + op2  

SUB op1, op2 op1 = op1 - op2

ADC op1, op2 op1 = op1 + op2 + Carry

SBB op1, op2 op1 = op1 - op2 - Carry  

INC op1 op1 ++;  

DEC op1 op1 --;  

MUL op1 Si op1 es tipo byte: AX = AL * op1

    Si op1 es tipo word: (DX:AX) = AX * op1

DIV op1 Si op1 es tipo byte: AL = AX / op1

      AH = AX % op1

    Si op1 es tipo word: AX = (DX : AX) / op1

      DX = (DX : AX) % op1

NEG op1 op1 = - op1  

ROTACIONES Y DESPLAZAMIENTOS

• SHL op1, cuenta op1 <<= cuenta

• SHR op1, cuenta op1 >>= cuenta

• ROL op1, cuenta (no hay equivalente)

• ROR op1, cuenta (no hay equivalente)• En todas las instrucciones de rotación/desplazamiento de bits,

cuenta puede ser 1 o bien CX.

OPERACIONES LOGICAS

Instrucción Operandos Función equivalente en "C"

AND op1, op2 op1 = op1 & op2

OR op1, op2 op1 = op1 | op2

XOR op1, op2 op1 = op1 ^ op2

NOT op1 op1 = ~op1

CONDICIONES Y SALTOSInstrucción Operandos Descripción

Bandera Examinada

JMP etiqueta  

CMP op1, op2  

Comparaciones sin signo

JB/JNAE etiqueta Salta si es menor o salta si no es mayor o igual

CF

JNB/JAE etiqueta Salta si es mayor o igual o salta si no es menor

CF

JBE/JNA etiqueta Salta si es menor o igual o salta si no es mayor

CF, AF

JNBE/JA etiqueta Bifurca si es mayor o salta si no es menor o igual

CF, ZF

JE/JZ etiqueta Salta si es igual o salta si es cero

ZF

JNE/JNZ etiqueta Salta si no es igual o salta si no es cero

ZF

CONDICIONES Y SALTOS

Instrucción Operandos DescripciónBandera

Examinada

JL/JNGE etiqueta Salta si es menor o salta si no es mayor o igual SF, OF

JNL/JGE etiqueta Salta si es mayor o igual o salta si no es menor SF, OF

JLE/JNG etiqueta Salta si es menor o igual o salta si no es mayor ZF, SF, OF

JNLE/JG etiqueta Salta si es mayor o salta si no es menor o igual ZF, SF, OF

JP/JPE etiqueta Salta si hay paridad o salta si la paridad es par PF

JNP/JPO etiqueta Salta si no hay paridad o salta si la paridad es impar

PF

JS etiqueta Salta si el signo es negativo SF

JNS etiqueta Salta si el signo es positivo SF

JC etiqueta Salta si hay acarreo CF

JNC etiqueta Salta si no hay acarreo CF

JO etiqueta Salta si hay desbordamiento OF

JNO etiqueta Salta si no hay desbordamiento OF

Uso de procedimientos/subrutinas

Instrucción Operandos Función equivalente en "C"

CALL etiqueta Llamada a función

    PUSH IP

    PUSH CS ; Sólo si es llamada larga (CALL FAR)

    JMP etiqueta

RET (ninguno) return

    POP IP-temp

    POP CS-temp ; Sólo si es llamada larga (RETF)

    JMP CS-temp:IP-temp

Instrucciones para Código.model <modelo de memoria>Nos indica qué modelo de memoria se usará para ensamblar este programa. Este concepto se verá más adelante en el curso.Para las aplicaciones comunes, usaremos siempre el modelo small. De esta manera, un programa fuente iniciará con la directiva ".model small" •.stack <tamaño en bytes>Le indica al ensamblador cuánto espacio deberá reservar para la pila del sistema. Como hay funciones básicas que usan la pila, aunque nosotros no la usemos explícitamente, debe dejarse un espacio razonable.Para la generalidad de las aplicaciones, basta reservar unos 256 bytes (100h). Por ello, generalmente veremos a los programas fuentes tener la directiva ".stack 100h" •.dataEsta directiva indica dónde inicia la definición de las variables. Generalmente, esta zona de memoria se asociará al registro DS; de hecho, se considera que es la definición del contenido y espacio reservado para el segmento de datos por defecto. •.codeEsta directiva indicará al ensamblador dónde inicia el código. A partir de ella, se encontrarán las instrucciones propiamente dichas.

Para uso de procedimientos: •<etiqueta> PROC {NEAR/FAR}Asocia una etiqueta a un procedimiento. Por ejemplo, si ponemos:Principal PROCesto definirá el punto de inicio del procedimiento llamado "Principal".NEAR o FAR son parámetros opcionales, que por el momento omitiremos, revisando su uso en el tema de Modelos de Memoria. •<etiqueta> ENDPCierra un procedimiento, debe estar balanceado con un PROC para abrirlo. •END {etiqueta}Cierra un módulo de programa. Esta directiva le indica al Ensamblador que ignore cualquier cosa que venga después; es como decirle que ahí acabó el archivo con el código fuente.El parámetro (opcional) "etiqueta" indica en qué procedimiento iniciará la ejecución del programa. Así como en Pascal el programa inicia siempre en el begin principal, y en C iniciará en la función main, sin importar su localización, en Ensamblador usaremos esta directiva para indicar dónde iniciar el programa. Por ejemplo:END Principalindica al Ensamblador que la ejecución iniciará en el procedimiento o etiqueta Principal.En caso de omitirse el parámetro opcional, la ejecución se inicia en la primera instrucción después de la directiva .code.

Formato de Programa.MODEL SMALL

.CODE

.DATA

Programa:

MOV AX,4C00H

INT 21H

.STACK

END Programa

Llamada a procedimientosPage 60,132

Title llamada a procedimiento.model small

.stack 64.data

;…………………………………………………………….code

Empezar proc farCall B10

Mov AX, 4C00HInt 21H

Empezar endp;…………………………………………………………….

B10 proc near Call C10

Ret B10 endp

;……………………………………………………………….C10 proc near

RetC10 endp

;………………………………………………………………...End empezar