1. Trang chủ
  2. » Khoa Học Tự Nhiên

manual de lenguaje ensamblador

17 426 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 17
Dung lượng 166,05 KB

Nội dung

MANUAL DE PROGRAMACIÓN EN ENSAMBLADOR 8086 ALUMNO: SANTIAGO SÁNCHEZ GONZÁLEZ TITULACIĨN: I.T.I SISTEMAS ARQUITECTURA DE COMPUTADORES I ÍNDICE: PÁGINA Introducción al ensamblador Procesos para la creación de un programa .2 Registros internos de la Unidad Central de Proceso (UCP) .2 Segmentos y registros asociados Software necesario La estructura del ensamblador Técnicas de codificación en ensamblador Ejemplo Práctico de un programa en ensamblador Interrupciones Internas del Hardware Externas del Hardware Interrupciones Software .7 Saltos, ciclos y procedimientos Movimiento de los datos Instrucción MOV Operaciones lógicas y aritméticas 10 Operaciones aritméticas .10 Operaciones lógicas 11 Apéndice de interrupciones 12 Apéndice del juego de instrucciones del 8086 .13 INTRODUCCIÓN AL ENSAMBLADOR: El lenguaje ensamblador es el sistema alfanumérico para escribir código máquina mediante expresiones abreviadas (mnemotécnicos) La compilación es más complicada porque incluye la conversión de operaciones matemáticas complejas, comandos de lenguaje natural o tipos de comandos complejos Cada ordenador tiene su propio lenguaje ensamblador, exclusivo de su CPU; un lenguaje de alto nivel (LAN) puede ser compilado en distintas máquinas Es usado principalmente porque hay aplicaciones o programas que deben tratar directamente los registros de la máquina, la memoria, dispositivos de E/S, etc PROCESOS PARA LA CREACIÓN DE UN PROGRAMA: Para la creación de un programa es necesario seguir cinco pasos: Diso del algoritmo, codificación del mismo, su traducción a lenguaje máquina, la prueba del programa y la depuración En la etapa de diseño se plantea el problema a resolver y se propone la mejor solución, creando diagramas esquemáticos utilizados para el mejor planteamiento de la solución La codificación del programa consiste en escribir el programa en algún lenguaje de programación (en este caso en ensamblador 8086), tomando como base la solución propuesta en el paso anterior La traducción al lenguaje máquina es la creación del programa objeto, esto es, el programa escrito como una secuencia de ceros y unos que pueda ser interpretado por el procesador La prueba del programa consiste en verificar que el programa funcione sin errores, o sea, que haga lo que tiene que hacer La última etapa es la eliminación de las fallas detectadas en el programa durante la fase de prueba La corrección de una falla normalmente requiere la repetición de los pasos comenzando desde el primero o el segundo Para crear un programa en ensamblador utilizararemos el debugger, que se encuentra en cualquier PC el sistema operativo MS-DOS, lo cual lo pone al alcance de cualquier usuario que tenga acceso a una máquina estas características Debug solo puede crear archivos extensión EXE, y por las características de este tipo de programas no pueden ser mayores de 64 kb, además deben comenzar en el desplazamiento, offset, o dirección de memoria 0100Hh dentro del segmento específico REGISTROS INTERNOS DE LA UNIDAD CENTRAL DE PROCESO (UCP): La UCP o CPU tiene 14 registros internos, cada uno de ellos de 16 bits (una palabra) Los bits están enumerados de derecha a izquierda, de tal modo que el bit menos significativo es el bit Los registros se pueden clasificar de la siguiente forma: Registros de datos: AX: Registro acumulador Es el principal empleado en las operaciones aritméticas BX: Registro base Se usa para indicar un desplazamiento CX: Registro contador Se usa como contador en los bucles DX: Registro de datos También se usa en las operaciones aritméticas Estos registros son de uso general y también pueden ser utilizados como registros de bits, para utilizarlos como tales es necesario referirse a ellos como por ejemplo: AH y AL, que son los bytes alto (high) y bajo (low) del registro AX Esta nomenclatura es aplicable también a los registros BX, CX y DX Registros de segmentos: CS: Registro de segmento de código Contiene la dirección de las instrucciones del programa DS: Registro segmento de datos Contiene la dirección del área de memoria donde se encuentran los datos del programa SS: Registro segmento de pila Contiene la dirección del segmento de pila La pila es un espacio de memoria temporal que se usa para almacenar valores de 16 bits (palabras) ES: Registro segmento extra Contiene la dirección del segmento extra Se trata de un segmento de datos adicional que se utiliza para superar la limitación de los 64Kb del segmento de datos y para hacer transferencias de datos entre segmentos Registros punteros de pila: SP: Puntero de la pila Contiene la dirección relativa al segmento de la pila BP: Puntero base Se utiliza para fijar el puntero de pila y así poder acceder a los elementos de la pila Registros índices: SI: Índice fuente DI: Índice destino Puntero de instrucciones: IP: Registro puntero de instrucción o contador de programa (PC) Contiene el desplazamiento de la siguiente instrucción a ejecutar respecto al segmento de código en ejecución Por lo tanto, la dirección completa de la siguiente instrucción sería CS:IP La única forma de influir en este registro es de forma indirecta mediante instrucciones de bifurcación Registro de banderas (flags): Cada bandera es un bit y se usa para registrar la información de estado y de control de las operaciones del microprocesador Hay nueve banderas (los bits restantes no se utilizan): Banderas de estado: Registran el estado del procesador, normalmente asociado a una comparación o a una instrucción aritmética CF: Bandera de acareo OF: Bandera de desbordamiento (aritmético) ZF: Bandera de resultado o comparación igual SF: Bandera de resultado o comparación negativa PF: Bandera de paridad (número par de bits) AF: Bandera auxiliar Indica si hay necesidad de ajuste en las operaciones aritméticas números BCD Banderas de control: DF: Bandera de dirección Controla la dirección de las operaciones cadenas de caracteres incrementando o decrementando automáticamente los registros índices (SI y DI) IF: Bandera de interrupciones Indica si están permitidas o no las interrupciones de los dispositivos externos TF: Bandera de atrape Controla la operación de modo paso a paso (usada por el programa DEBUG) SEGMENTOS Y REGISTROS ASOCIADOS: La arquitectura de los procesadores x86 obliga al uso de segmentos de memoria para manejar la información, el tamo de estos segmentos es de 64kb La razón de ser de estos segmentos es que, considerando que el tamaño máximo de un número que puede manejar el procesador esta dado por una palabra de 16 bits o registro, no sería posible accesar a más de 65536 localidades de memoria utilizando uno solo de estos registros, ahora, si se divide la memoria de la pc en grupos o segmentos, cada uno de 65536 localidades, y utilizamos una dirección en un registro exclusivo para localizar cada segmento, y entonces cada dirección de una casilla específica la formamos dos registros, nos es posible acceder a una cantidad de 4294967296 bytes de memoria, lo cual es, en la actualidad, más memoria de la que veremos instalada en una PC Para que el ensamblador pueda manejar los datos es necesario que cada dato o instrucción se encuentren localizados en el área que corresponde a sus respectivos segmentos El ensamblador accede a esta información tomando en cuenta la localización del segmento, dada por los registros DS, ES, SS y CS, y dentro de dicho registro la dirección del dato específico Es por ello que cuando creamos un programa empleando el Debug en cada línea que vamos ensamblando aparece algo parecido a lo siguiente: 1CB0:0102 MOV AX,BX En donde el primer número, 1CB0, corresponde al segmento de memoria que se está utilizando, el segundo se refiere la la dirección dentro de dicho segmento, y a continuación aparecen las instrucciones que se almacenaran a partir de esa dirección La forma de indicarle al ensamblador cuales de los segmentos se va a trabajar es por medio de las directivas CODE, DATA y STACK El ensamblador se encarga de ajustar el tamaño de los segmentos tomando como base el número de bytes que necesita cada instrucción que va ensamblando, ya que sería un desperdicio de memoria utilizar los segmentos completos Por ejemplo, si un programa únicamente necesita 10kb para almacenar los datos, el segmento de datos únicamente será de 10kb y no de los 64kb que puede manejar Un programa consta de tipos de segmentos Cada segmento se direcciona mediante un determinado tipo de registro de segmento: Segmento código: Cada instrucción se direcciona mediante el registro segmento de código y el registro de desplazamiento IP, CS:IP Segmento de datos: Los datos de direccionan mediante el registro de segmento de dato y un registro de desplazamiento (BX, SI o DI), por ejemplo DS:BX Segmento de pila: Los datos se direccionan mediante el registro segmento de pila y un registro de desplazamiento (SP o BP), por ejemplo SS:SP Segmento extra: Igual que el de datos, sustituyendo el registro de segmento, por ejemplo ES:BX SOFTWARE NECESARIO: Para poder crear un programa se requieren varias herramientas: Primero un editor para crear el programa fuente Segundo un compilador (Turbo Assembler) que no es mas que un programa que "traduce" el programa fuente a un programa objeto Y tercero un enlazador (Turbo Linker), que genere el programa ejecutable a partir del programa objeto El editor puede ser cualquier editor de textos que se tenga a la mano, como compilador utilizaremos el programa Turbo Assembler (TASM), y como enlazador utilizaremos el Turbo Link (TLINK) La extensión usada para que el TASM reconozca los programas fuente en ensamblador es ASM, una vez traducido el programa fuente, el TASM crea un archivo la extensión OBJ, este archivo contiene un "formato intermedio" del programa, llamado así porque ẳn no es ejecutable pero tampoco es ya un programa en lenguaje fuente El enlazador genera, a partir de un archivo OBJ o la combinación de varios de estos archivos, un programa ejecutable, cuya extensión es EXE LA ESTRUCTURA DEL ENSAMBLADOR: En el lenguaje ensamblador las líneas de código constan de dos partes, la primera es el nombre de la instrucción que se va a ejecutar y la segunda son los parámetros del comando u operando Por ejemplo: ADD ah bh Aquí "ADD" es el comando a ejecutar (en este caso una adición o suma) y tanto "ah" como "bh" son los parámetros El nombre de las instrucciones en este lenguaje puede estar formado de a letras, a estas instrucciones también se les llama nombres mnemónicos o códigos de operación, ya que representan alguna función que habrá de realizar el procesador Existen algunos comandos que no requieren parámetros para su operación, así como otros que requieren solo un parámetro Algunas veces se utilizarán las instrucciones como sigue: ADD al,[170] Los corchetes en el segundo parámetro nos indican que vamos a trabajar el contenido de la casilla de memoria número 170 y no el valor 170, a esto se le conoce como direccionamiento directo (en la instrucción viene la dirección del objeto) TÉCNICAS DE CODIFICACIĨN EN ENSAMBLADOR: En ensamblador los bucle, condicionales, subrutinas y demás elementos se codifica de forma distinta de cómo se hace en otros lenguajes de alto nivel A continuación describiremos algunas técnicas útiles para codificar las estructuras mas usuales BUCLES: Inicialización de un registro(a modo de contador) al nº de vueltas del bucle Etiqueta: Primera instrucción del bucle decrementar el contador saltar a la etiqueta si el contador es mayor que cero SALTOS CONDICIONALES: Instrucción de comparación Evaluar condición y si se cumple saltar a la etiqueta prefijada saltar fuera del condicional MACROS: Declaración: MACRO ENDM Llamada: SUBRUTINAS: Declaración: PROC RET ENDP Llamada: CALL EJEMPLO PRÁCTICO DE UN PROGRAMA EN ENSAMBLADOR 8086: A continuación haremos un pequo programa de ejemplo que nos imprimirá por pantalla la palabra “HOLA”, para hacer comentarios se usará el “;” dentro del propio código fuente como vemos a continuación: MODEL SMALL STACK 100h CR EQU 13 LF EQU 10 DATA TEXTO DB ‘HOLA$’,CR,LF CODE MOV AX, SEG TEXTO MOV DS,AX LEA DX,TEXTO MOV AH,9 INT 21h MOV AH,4ch INT 21h END ;modelo pequo de compilación (64k como máximo) ;Segmento de pila: Pila 256 posiciones ;Declaración de constantes ;Comienzo del segmento de datos ;Reserva de memoria retorno de carro e ;Inicio de línea, la variable TEXTO es de tipo ;byte,el símbolo $ es el símbolo de fin de cadena ;Comienzo del segmento de código ;Mueve a AX la dirección del primer byte del ;segmento de datos ;Mueve dicha dirección al segmento de datos ;Cargamos en DX la dirección efectiva del texto ;que vamos a imprimir por pantalla ;función “Escribir texto por pantalla” ;Llamada a DOS por medio de la interrupción ;para ejecutar la función ;función “Retornar a DOS” ;Interrupción que llama a DOS para terminar el ;programa ;fin INTERRUPCIONES: Definición de interrupción: Una interrupción es una instrucción que detiene la ejecución de un programa para permitir el uso de la UCP a un proceso prioritario Una vez concluido este último proceso se devuelve el control a la aplicación anterior Por ejemplo, cuando estamos trabajando un procesador de palabras y en ese momento llega un aviso de uno de los puertos de comunicaciones, se detiene temporalmente la aplicación que estábamos utilizando para permitir el uso del procesador al manejo de la información que está legando en ese momento Una vez terminada la transferencia de información se reanudan las funciones normales del procesador de palabras Las interrupciones ocurren muy seguido, sencillamente la interrupción que actualiza la hora del día ocurre aproximadamente 18 veces por segundo Para lograr administrar todas estas interrupciones, la computadora cuenta un espacio de memoria, llamado memoria baja, donde se almacenan las direcciones de cierta localidad de memoria donde se encuentran un juego de instrucciones que la UCP ejecutará para después regresar a la aplicación en proceso La sentencia para usar una interrupción en ensamblador es INT número En el programa anterior hicimos uso de la interrupción número 21h para llamar a DOS A continuación describiremos los tipos de interrupciones: 1) INTERRUPCIONES INTERNAS DE HARDWARE: Las interrupciones internas son generadas por ciertos eventos que surgen durante la ejecución de un programa Este tipo de interrupciones son manejadas en su totalidad por el hardware y no es posible modificarlas Un ejemplo claro de este tipo de interrupciones es la que actualiza el contador del reloj interno de la computadora, el hardware hace el llamado a esta interrupción varias veces durante un segundo para mantener la hora actualizada Aunque no podemos manejar directamente esta interrupción (no podemos controlar por software las actualizaciones del reloj), es posible utilizar sus efectos en la computadora para nuestro beneficio, por ejemplo para crear un "reloj virtual" actualizado continuamente gracias al contador del reloj interno Unicamente debemos escribir un programa que lea el valor actual del contador y lo traduzca a un formato entendible para el usuario 2) INTERRUPCIONES EXTERNAS DE HARDWARE: Las interrupciones externas las generan los dispositivos periféricos, como pueden ser: teclado, impresoras, tarjetas de comunicaciones, etc También son generadas por los coprocesadores No es posible desactivar a las interrupciones externas Estas interrupciones no son enviadas directamente a la UCP, sino que se mandan a un circuito integrado cuya función es exclusivamente manejar este tipo de interrupciones El circuito, llamado PIC 8259A, si es controlado por la UCP utilizando para tal control una serie de vías de comunicación llamadas puertos 3) INTERRUPCIONES DE SOFTWARE: Las interrupciones de software pueden ser activadas directamente por el ensamblador invocando al número de interrupción deseada la instrucción INT El uso de las interrupciones nos ayuda en la creación de programas, utilizándolas nuestros programas son más cortos, es más fácil entenderlos y usualmente tienen un mejor desempeño debido en gran parte a su menor tamaño Este tipo de interrupciones podemos separarlas en dos categorías: las interrupciones del sistema operativo DOS y las interrupciones del BIOS La diferencia entre ambas es que las interrupciones del sistema operativo son más fáciles de usar pero también son más lentas ya que estas interrupciones hacen uso del BIOS para lograr su cometido, en cambio las interrupciones del BIOS son mucho más rápidas pero tienen la desventaja que, como son parte del hardware son muy específicas y pueden variar dependiendo incluso de la marca del fabricante del circuito La elección del tipo de interrupción a utilizar dependerá únicamente de las características que le quiera dar a su programa: velocidad (utilizando las del BIOS) o portabilidad (utilizando las del DOS) Interrupción 21H Propósito: Llamar a diversas funciones del DOS Sintaxis: Int 21H Nota: Cuando trabajamos en TASM es necesario especificar que el valor que estamos utilizando es hexadecimal Esta interrupción tiene varias funciones, para acceder a cada una de ellas es necesario que el registro AH se encuentre el número de función que se requiera al momento de llamar a la interrupción SALTOS, CICLOS Y PROCEDIEMIENTOS: Los saltos incondicionales en un programa escrito en lenguaje ensamblador están dados por la instrucción JMP, un salto es alterar el flujo de la ejecución de un programa enviando el control a la dirección indicada Un ciclo, conocido también como iteración o bucle, es la repetición de un proceso un cierto número de veces hasta que alguna condición se cumpla En estos ciclos se utilizan los bifurcaciones "condicionales" basados en el estado de las banderas Por ejemplo la instrucción JNZ que salta solamente si el resultado de una operación es diferente de cero y la instrucción JZ que salta si el resultado de la operación es cero Por último tenemos los procedimientos o rutinas, que son una serie de pasos que se usarán repetidamente en el programa y en lugar de escribir todo el conjunto de pasos únicamente se les llama por medio de la instrucción CALL Un procedimiento en ensamblador es aquel que inicie la palabra PROC y termine la palabra RET (ya explicado anteriormente) Realmente lo que sucede el uso de la instrucción call es que se guarda en la pila el registro IP y se carga la dirección del procedimiento en el mismo registro, conociendo que IP contiene la localización de la siguiente instrucción que ejecutara la UCP, entonces podemos darnos cuenta que se desvía el flujo del programa hacia la dirección especificada en este registro Al momento en que se llega a la palabra ret se saca de la pila el valor de IP lo que se devuelve el control al punto del programa donde se invocó al procedimiento Es posible llamar a un procedimiento que se encuentre ubicado en otro segmento, para ésto el contenido de CS (que nos indica que segmento se está utilizando) es empujado también en la pila MOVIENTO DE LOS DATOS: En todo programa es necesario mover datos en la memoria y en los registros de la UCP; existen diversas formas de hacer esto: puede copiar datos de la memoria a algún registro, de registro a registro, de un registro a una pila, de la pila a un registro, transmitir datos hacia dispositivos externos así como recibir datos de dichos dispositivos Este movimiento de datos está sujeto a reglas y restricciones Algunas de ellas son las que se citan a continuación No es posible mover datos de una localidad de memoria a otra directamente, es necesario primero mover los datos de la localidad origen hacia un registro y luego del registro a la localidad destino No se puede mover una constante directamente a un registro de segmentos, primero se debe mover a un registro de la UCP Es posible mover bloques de datos por medio de las instrucciones movs, que copia una cadena de bytes o palabras; movsb que copia n bytes de una localidad a otra; y movsw copia n palabras de una localidad a otra Las dos últimas instrucciones toman los valores de las direcciones definidas por DS:SI como grupo de datos a mover y ES:DI como nueva localización de los datos Para mover los datos también existen las estructuras llamadas pilas, en este tipo de estructuras los datos se introducen la instrucción PUSH y se extraen la instrucción POP En una pila el primer dato introducido es el último que podemos sacar, esto es, si en nuestro programa utilizamos las instrucciones: PUSH AX PUSH BX PUSH CX Para devolver los valores correctos a cada registro al momento de sacarlos de la pila es necesario hacerlo en el siguiente orden: POP CX POP BX POP AX Para la comunicación dispositivos externos se utilizan el comando out para mandar información a un puerto y el comando in para leer información recibida desde algun puerto La sintaxis del comando out es: OUT DX,AX Donde DX contiene el valor del puerto que se utilizará para la comunicación y AX contiene la información que se mandará La sintaxis del comando in es: IN AX,DX Donde AX es el registro donde se guardará la información que llegue y DX contiene la dirección del puerto por donde llegará la información A continuación nos centraremos la instrucción MOV, ya que es la más empleada para hacer transferencias de datos INSTRUCCIĨN MOV: Propósito: Transferencia de datos entre celdas de memoria, registros y acumulador Sintaxis: MOV Destino,Fuente Donde Destino es el lugar a donde se moverán los datos y fuente es el lugar donde se encuentran dichos datos Los diferentes movimientos de datos permitidos para esta instrucción son: Destino: memoria Fuente: acumulador Destino: acumulador Fuente: memoria Destino: registro de segmento Fuente: memoria/registro Destino: memoria/registro Fuente: registro de segmento Destino: registro Fuente: registro Destino: registro Fuente: memoria Destino: memoria Fuente: registro Destino: registro Fuente: dato inmediato Destino: memoria Fuente: dato inmediato Ejemplo: MOV AX,0006h MOV BX,AX MOV AH,4Ch INT 21H Este pequeño programa mueve el valor 0006H al registro AX, luego mueve el contenido de AX (0006h) al registro BX, por último mueve el valor 4Ch al semiregistro AH (parte alta del registro de datos AX) para terminar la ejecución la opción 4C de la interrupción 21h OPERACIONES LĨGICAS Y ARITMÉTICAS: Las instrucciones de las operaciones lógicas son: AND, NOT, OR y XOR, éstas trabajan sobre los bits de sus operandos Para verificar el resultado de operaciones recurrimos a la instrucción CMP Las instrucciones utilizadas para las operaciones algebraicas son: para sumar ADD, para restar SUB, para multiplicar MUL y para dividir DIV Casi todas las instrucciones de comparación están basadas en la información contenida en el registro de banderas Normalmente las banderas de este registro que pueden ser directamente manipuladas por el programador son la bandera de dirección de datos DF, usada para definir las operaciones sobre cadenas Otra que también puede ser manipulada es la bandera IF por medio de las instrucciones STI y CLI, para activar y desactivar respectivamente las interrupciones A continuación explicaremos brevemente las intrucciones aritméticas y lógicas por separado: OPERACIONES ARITMÉTICAS: Las operaciones en aritmética binaria a entera permiten a la CPU realizar cálculos números enteros positivos y negativos una representación en complemento a • NEG operando: cambia el signo del operando Equivaldría al NOT del número y le sumaría • ADD destino, fuente: destino = destino + fuente • ADC destino, fuente: destino = destino + fuente + carry (acarreo) • SUB destino, fuente: destino = destino - fuente • SBB destino, fuente: destino = destino - (fuente + acarreo) • MUL operando: multiplica sin considerar el signo Multiplica el acumulador {AL} o {AX}por el operando fuente Si el operando fuente es de tipo byte, el resultado se almacena en AX y si es de tipo palabra el resultado se almacena en AX la parte inferior y en DX la palabra superior Si tipo fuente = byte: AX = AL * fuente (multiplicación sin signo) Si tipo fuente = palabra: DX, AX = AX * fuente (multiplicación sin signo) Si mitad superior (CF: acarreo) del resultado = En CC CF = • IMUL operando: multiplica considerando el signo • DIV operando: divide sin considerar el signo, un número contenido en el acumulador entre el operando fuente El cociente se almacena en el acumulador El resto se almacena en la extensión del acumulador Si la extensión de AX será DX (que ocurrirá cuando sea de tipo palabra), la operación y la extensión de AL será AH AX AX AL DX • • • • • IDIV operando: igual que el DIV pero considerando el signo CBW: pasa de byte a palabra el contenido del acumulador CWD: pasa de palabra a doble palabra el contenido del acumulador INC destino: incrementa el destino DEC destino: decrementa el destino 10 OPERACIONES LÓGICAS: Se usan para realizar operaciones a nivel de bits • NOT operando: cambia los bits por y viceversa y devuelve el resultado en el mismo operando AL = F2h AL 1111 0010 NOT AL; NOT AL 0000 1101 = Odh • OR destino, fuente: operación o lógico inclusivo El resultado se almacena en destino AX = FEDCh= 1111 1110 1101 1100 BX = 1234 h = 0001 0010 0011 0100 OR AX, BX 1111 1110 1111 1100 = FEFC h • AND destino, fuente: la operación Y lógica entre operandos, el resultado se deja en destino AX = FEDC h 1111 1110 1101 1100 BX = 1234 h 0001 0010 0011 0100 ADD AX, BX 0001 0010 0001 0100 = 1214 h • XOR destino, fuente: la operación o lógico exclusiva; el resultado se deja en destino AX = FEDC h 1111 1110 1101 1100 BX = 1234 h 0001 0010 0011 0100 XOR AX, BX 1110 1100 1110 1000 = ECE8 h 11 APENDICE 1- INTERRUPCIONES DIRECCION (hex) 0-3 4-7 8-B C-F 10-13 14-17 18-1F 20-23 24-27 28-37 38-3B 3C-3F 40-43 44-47 48-4B 4C-4F 50-53 54-57 58-5B 5C-5F 60-63 64-67 68-6B 6C-6F 70-73 74-77 78-7B 7C-7F ASCII 128-255 80-83 84-87 88-8B 90-93 94-97 98-9B 9C-9F A0-FF 100-1FF 200-217 218-3C3 3C4-3FF INTERRUPCION (hex) 6,7 A,B,C,D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 24 25 26 27 28-3F 40-7F 80-85 86-F0 F1-FF FUNCION Division by zero Single step trace Non maskable interrupt Break point instruction Overflow Print screen Reserved Timer Keyboard interrupt Reserved Diskette interrupt Reserved Video screen I/O Equipment check Memory size check Diskette I/O Communication I/O Cassette I/O Keyboard input Printer Output ROM Basic entry code Bootstrap loader Time of day Get control on keyboard break Get control on timer interrupt Pointer to video initialization table Pointer to diskette parameter table Pointer to table for graphics characters DOS program terminate DOS function call DOS terminate address DOS fatal error vector DOS absolute disk read DOS absolute disk write DOS terminate, fix in storage Reserved for DOS Not used Reserved by BASIC Used by BASIC interpreter Not Used 12 APÉNDICE 2.- JUEGO DE INSTRUCCIONES DEL 8086 En la siguiente lista de instrucciones, para la descripción y su sintaxis se recurre a las siguientes abreviaturas: acum reg segreg r/m inmed mem etiqueta src dest uno de los acumuladores: AX o AL cualquiera de los registros uno de los registros de segmento uno de los operandos generales: registro, memoria, basado, indexado o basado-indexado constante o símbolo de o 16 bits un operando de memoria: símbolo, etiqueta, variable etiqueta de instrucciones fuente en operaciones de cadena destino en operaciones de cadena 8086 AAA AAD AAM AAS ADC acum, inmed r/m,inmed r/m, reg reg, r/m ADD acum,inmed r/m,inmed r/m, reg reg, r/m AND acum,inmed r/m,inmed r/m, reg reg, r/m CALL etiqueta r/m CBW CLC CLD CLI CMC CMP acum,inmed r/m,inmed r/m, reg reg, r/m CMPS src,dest CMPSB CMPSW CWD Ajuste ASCII para adición Ajuste ASCII para división Ajuste ASCII para multiplicación Ajuste ASCII para división Suma acarreo Suma Operación AND a nivel bit Llamado Convierte byte apalabra Limpia bandera de acarreo Limpia bandera de dirección Limpia bandera de interrupción Complementa bandera de acarreo Comparación Comparación de cadenas Compara cadenas byte por byte Compara cadenas palabra por palabra Convierte palabra a palabra doble 13 DAA Ajuste decimal para adición DAS DEC r/m reg DIV r/m ESC inmed, r/m HLT IDIV r/m IMUL r/m IN accum,inmed acum, DX INC r/m reg INT3 INT inmed INTO IRET JMP etiqueta r/m J(condición)etiqueta Ajuste decimal para substracción Decremento LAHF LDS r/m LEA r/m LES r/m LOCK LODS src LODSB LODSW LOOP etiqueta LOOPE etiqueta LOOPNE etiqueta LOOPNZ etiqueta LOOPZ etiqueta MOV acum,mem r/m,inmed mem, acum r/m, reg r/m,segreg reg, inmed reg,r/m segreg,r/m MOVS dest, src División Escape bits Alto División entera Mutiplicación entera Entrada desde puerto Incremento Interrupción3 codificada como un byte Interrupción0-255 Interrupción en overflow Retorno de interrupción Brinco incondicional Brinca de acuerdo a las condiciones: A (arriba), AE (arriba o igual), B (siguiente), BE (siguiente o igual), C(acarreo), CXZ (CX en cero), E (igual), G (mayor), GE (mayor o igual), L (menor), LE (menor o igual), NA (no anterior), NAE (no anterior o igual), NB (no siguiente), NBE(no siguiente o igual), NC (no acarreo), NE (no igual), NG(no mayor), NGE (no mayor o igual), NL (no menor), NLE (no menor o igual), NO(no sobreflujo), NP (no paridad), NS (no signo), NZ (no cero), O(sobreflujo), P (paridad), PE(paridad par), PO (paridad impar), S (signo), Z (cero) Carga AH las banderas Carga DS Carga la dirección Carga ES Cierra bus Carga cadena Carga byte de cadena en AL Carga palabra de la cadena en AX Ciclo Ciclo mientras igual Ciclo mientras no igual Ciclo mientras no cero Ciclo mientras cero Mueve un valor del segundo al primer operando Mueve cadena 14 MOVSB MOVSW Mueve cadena byte por byte Mueve cadena palabra por palabra MUL r/m NEG r/m NOP NOT r/m OR acum, inmed r/m,inmed r/m, reg reg,r/m OUTDX, accum inmed, acum POP r/m reg segreg POPF PUSH r/m reg segreg PUSHF RCL r/m,1 r/m,CL RCR r/m, r/m, CL REP REPE REPNE REPNZ REPZ RET [inmed] ROL r/m,1 r/m, CL ROR r/m,1 r/m, CL SAHF SAL r/m, r/m, CL SAR r/m, r/m, CL SBB acum, inmed r/m,inmed r/m, reg reg,r/m SCAS dest SCASB SCASW SHL r/m, r/m, CL SHR r/m, Multiplicación Niega(complemento a 2) Operación ociosa Invierte valores de bits (complemento a 1) Operación OR a nivel de bit Salida por el puerto dado por el primer operando (inmediato de bits) Recupera valor de la pila Recupera banderas Guarda valor en la pila Guarda banderas Rotación a la izquierda acarreo Rotación a la derecha acarreo Repite Repite si igual Repite si no igual Repite si no cero Repite si cero Regresa después de recuperar bytes de la pila Rotación a la izquierda Rotación a la derecha Carga banderas el valor de AH Desplazamiento aritmético a la izquierda Desplazamiento aritmético a la derecha Substracción acarreo Explora cadena Explora cadena para el byte en AL Explora cadena por la palabra en AX Desplazamiento a la izquierda Desplazamiento a la derecha 15 r/m, CL STC STD STI STOS dest STOSB STOSW SUB accum, inmed r/m,inmed r/m, reg reg,r/m TEST acum, inmed r/m,inmed r/m, reg reg,r/m WAIT XCHG acum, reg r/m,inmed r/m, reg reg,r/m XLAT XOR acum, reg r/m,inmed r/m, reg reg,r/m Fija bandera de acarreo Fija bandera de dirección Fija bandera de interrupción Guarda cadena Guarda byte en AL en la cadena Guarda palabra en AX en la cadena Substracción Comparación Aguarda Intercambio Traduce Operación XOR a nivel bit 16 ... Bandera de acareo OF: Bandera de desbordamiento (aritmético) ZF: Bandera de resultado o comparación igual SF: Bandera de resultado o comparación negativa PF: Bandera de paridad (número par de. .. Limpia bandera de acarreo Limpia bandera de dirección Limpia bandera de interrupción Complementa bandera de acarreo Comparación Comparación de cadenas Compara cadenas byte por byte Compara cadenas... ;modelo pequo de compilación (64k como máximo) ;Segmento de pila: Pila 256 posiciones ;Declaración de constantes ;Comienzo del segmento de datos ;Reserva de memoria retorno de carro e ;Inicio de

Ngày đăng: 30/05/2014, 13:24

TỪ KHÓA LIÊN QUAN

w