ITT-327-T Microprocesadores Lenguaje de Programación Ensamblador. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Set de Instrucciones del 8088/8086. El set de instrucciones de un microprocesador define las operaciones básicas que el programador puede hacer realizar al dispositivo. El 8088 y el 8086 tienen el mismo conjunto de instrucciones, que consiste en un total de 117. El conjunto de instrucciones puede ser dividido en varios grupos de acuerdo al tipo de funcionalidad: ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Transferencia de Datos. Este grupo de instrucciones sirven para mover datos ya sea entre registros internos o entre un registro interno y una localidad de memoria. Este grupo está compuesto por las siguientes instrucciones: MOV (Move Byte or Word). Esta instrucción es usada para transferir un byte o una palabra desde una fuente a un destino. Tanto la fuente como el destino pueden ser registros internos del 8088/8086 o localidades de memoria. Nemónico MOV Significado Mover Formato MOV D,S ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Transferencia de Datos. Destino Fuente Ejemplo M emoria Acumulador Registro Registro M emoria Registro M emoria Registro de Segmento Registro de Segmento Registro 16 M emoria Acumulador M emoria Registro M emoria Registro Inmediato Inmediato Registro 16 M emoria 16 Registro de Segmento Registro de Segmento M OV [DATO],AX M OV AL,[VAR1] M OV BX,DX M OV CX,[VAR2] M OV [VAR3],BX M OV CH,8C M OV [VAR4],F2B5 M OV DS,AX M OV ES,[VAR5] M OV DX,CS M OV [VAR5],SS ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Transferencia de Datos. XCHG (Exchange Byte or Word). Esta instrucción se usa para intercambiar el contenido de 2 registros. Nemónico XCHG Significado Intercambiar Destino Acumulador M emoria Registro Registro Formato XCHG D,S Fuente Registro 16 Bits Registro Registro M emoria ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Transferencia de Datos. XLAT (Translate Byte). Cuando es usada esta instrucción, el registro BX representa la posición relativa del inicio de la tabla de dirección del segmento de datos corriente. También, AL representa la posición relativa en la tabla del dato que va a ser accesado. Nemónico XLAT Significado Traducir Formato XLAT Al ser ejecutada la instrucción, el contenido de AL es reemplazado por el contenido del espacio en memoria dado por (BX) + (AL). ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Transferencia de Datos. LEA (Load Effective Address). Se usa para cargar un registro específico con una dirección relativa de 16 bits. LEA SI, EA LDS (Load Data Segment). Es similar a LEA, excepto que carga el registro además del DS. LES (Load Extra Segment). Es similar a LEA, excepto que carga el registro además del ES. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Transferencia de Datos. Nemónico LEA LDS LES Significado Formato Cargar Dirección Relativa LEA Reg16, EA Cargar Registro y DS LDS Reg16, EA Cargar Registro y ES LES Reg16, EA ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones Aritméticas. Este grupo de instrucciones sirven para realizar operaciones aritméticas en una variedad de formatos como bytes o palabras con o sin signo, BCD, números ASCII, etc. Este grupo está a su vez dividido en 4 grupos: ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones Aritméticas. 1. Instrucciones de suma. ADD (Add Byte or Word). Es usada para sumar el un operando con el contenido del acumulador, algún otro registro, o una variable en memoria. El contenido de la fuente se suma al destino, y el resultado es llevado al destino. El carry resultante de la operación en el bit más significativo del destino se refleja en el carry flag, sin embargo, no es tomado en cuenta en la operación aritmética. ADC (Add Byte or Word with Carry). Trabaja de manera similar a la instrucción ADD, pero en este caso, se suma también el contenido del flag del carry. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones Aritméticas. 1. Instrucciones de suma. INC (Increment Byte or Word by 1). Su ejecución suma un 1 al operando específico. Puede usarse con un registro de 8 bits ó de 16 bits. AAA (ASCII Adjust for Addition). Es necesaria en el caso donde se realice una operación de suma de números expresados en código ASCII. Cuando se hace esto, se debe realizar un ajuste en el resultado en binario para convertirlo a su número decimal equivalente. Por esta razón debe ser usada inmediatamente después de la instrucción ADD que sumó datos en código ASCII. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones Aritméticas. 1. Instrucciones de suma. DAA (Decimal Adjust for Addition). Esta instrucción se usa para realizar una operación de ajuste similar a la ejecutada por la instrucción AAA, pero para la suma de dos números BCD. Nemónico ADD ADC INC AAA DAA Significado Suma Suma con carry Incrementar en 1 Ajuste ASCII para suma Ajuste Decimal para suma Formato ADD D,S ADC D,S INC D AAA DAA ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones Aritméticas. 2. Instrucciones de resta. SUB (Subtract Byte or Word). Se usa para restar el valor de un operando fuente del valor de un operando destino. El “llevo” que ocurre en la operación de resta del bit más significativo se refleja en el carry flag, pero no se toma en cuenta en la operación. SBB (Subtract Byte or Word with Borrow). Trabaja de manera similar a la instrucción SUB, pero en este caso, se toma en cuenta el contenido del flag del carry. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones Aritméticas. 2. Instrucciones de resta. DEC (Decrement Byte or Word by 1). Su ejecución resta un 1 al operando específico. Puede usarse con un registro de 8 bits ó de 16 bits. AAS (ASCII Adjust for Subtraction). Es necesaria en el caso donde se realice una operación de resta de números expresados en código ASCII. Cuando se hace esto, se debe realizar un ajuste en el resultado en binario para convertirlo a su número decimal equivalente. Por esta razón debe ser usada inmediatamente después de la instrucción que restó datos en código ASCII. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones Aritméticas. 2. Instrucciones de resta. DAS (Decimal Adjust for Subtraction). Esta instrucción se usa para realizar una operación de ajuste similar a la ejecutada por la instrucción AAS, pero para la resta de dos números BCD. NEG (Negate Byte or Word). Causa que el operando involucrado sea reemplazado por su valor negado. La operación se hace via el complemento a 2. Nemónico SUB SBB DEC DAS AAS NEG Significado Resta Resta con "llevo" Decrementar en 1 Ajuste ASCII para Resta Ajuste Decimal para resta Negación Formato SUB D,S SBB D,S DEC D DAS AAS NEG D ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones Aritméticas. 3. Instrucciones de multiplicación. MUL (Multiply Byte or Word Unsigned). Es una instrucción básica de multiplicación para números sin signo. El multiplicador fuente puede ser un byte o un word. El multiplicando destino será AL para una multiplicación de 8 bits, o AX para una multiplicación de 16 bits. (AX) (AL) x (Multiplicador 8 bits) Para multiplicaciones de 16 bits, el resultado está dado por: (DX,AX) (AX) x (Multiplicador 16 bits) Donde AX contiene los 16 bits menos significativos, y DX los 16 bits más significativos. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones Aritméticas. 3. Instrucciones de multiplicación. IMUL (Integer Multiply Byte or Word). Es la instrucción de multiplicación para números con signo. Opera de manera similar a la instrucción MUL. AAM (Adjust AX for Multiply). Esta Es una instrucción que provee un ajuste para una multiplicación en BCD. Esta asume que la instrucción anterior multiplicó 2 números BCD, produciendo un resultado en el registro AL. Nemónico MUL IMUL AAM Significado Formato Multiplicar MUL S Multiplicar tomando en cuenta signo IMUL S Ajustar AX para multiplicación AAM ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones Aritméticas. 4. Instrucciones de división. DIV (Divide Byte or Word Unsigned). Es una instrucción básica de división para números sin signo. Solo se especifica el operando fuente, ya que el dividendo es el registro AX para operaciones de 16 bits, o el contenido de DX y AX para operaciones de 32 bits. (AH, AL) (AX) / (Divisor 8 bits) Donde AH contiene el residuo, y AL el cociente. (DX),(AX) (DX, AX) / (Divisor 16 bits) Donde DX contiene el residuo, y AX el cociente. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones Aritméticas. 4. Instrucciones de división. IDIV (Integer Divide Byte or Word). Es la instrucción de división para números con signo. Opera de manera similar a la instrucción DIV. AAD (Adjust AX for Division). Esta Es una instrucción que provee un ajuste para una división en BCD. Esta asume que los registros AH y AL contienen números BCD. CBW (Convert Byte to Word). Cuando se hace una división de 8 bits a través del registro AL, se debe extender el signo del dividendo llenando los bits del registro AH. Si el número es positivo, AH se llena de 0’s, mientras que si es negativo, AH se llena de 1’s. En la ejecución de la instrucción CBW, se realiza esta conversión de manera automática. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones Aritméticas. 4. Instrucciones de división. CWD (Convert Word to Double Word). De manera similar, cuando se realiza una division del registro AX entre un divisor de16 bits, se debe extender el signo de AX en los 16 bits del registro DX. Nemónico DIV IDIV AAD CBW CWD Significado División División tomando en cuenta signo Ajustar AX para división Convertir byte a word Convertir word a double word ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Formato DIV S IDIV S AAD CBW CWD Instrucciones Lógicas. Este grupo de instrucciones sirven para realizar sus respectivas operaciones lógicas bit a bit en los operandos específicos de fuente y destino. El resultado siempre es colocado en el operando destino. AND. Realiza la operación lógica AND. OR. Realiza la operación lógica OR. XOR. Realiza la operación lógica XOR. NOT. Realiza la negación lógica. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones Lógicas. Nemónico AND OR XOR NOT Significado AND Lógica OR Lógica XOR Lógica NOT Lógica Formato AND D,S OR D, S XOR D,S NOT D Para las Instrucciones AND, OR, XOR Destino Fuente Registro Registro Memoria Registro Memoria Acumulador Registro Memoria Registro Número Número Número Para la Instrucción NOT Destino Registro Memoria ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Desplazamiento. Existen 4 instrucciones de desplazamiento que pueden ejecutar dos tipos básicos de operaciones: Desplazamiento Aritmético. Desplazamiento Lógico. Estos dos tipos de desplazamiento pueden ser hacia la derecha o hacia la izquierda. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Desplazamiento. SHL (Shift Logical Left). Esta causa el desplazamiento del registro destino hacia la izquierda en el número de posiciones especificadas. Los espacios de bits menos significativos son reemplazados con 0’s, mientras que se guarda en el carry flag el último bit desplazado. Si el desplazamiento es 1 posición, se puede colocar el número 1 directamente. Si es más, el número de posiciones se especifica con el registro CL. SAL (Shift Arithmetic Left). Esta causa el desplazamiento del registro destino hacia la izquierda en el número de posiciones especificadas. Los espacios de bits menos significativos son reemplazados con 0’s. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Desplazamiento. SHR (Shift Logical Right). Esta causa el desplazamiento del registro destino hacia la derecha en el número de posiciones especificadas. Los espacios de bits más significativos son reemplazados con 0’s, mientras que se guarda en el carry flag el último bit desplazado. Si el desplazamiento es 1 posición, se puede colocar el número 1 directamente. Si es más, el número de posiciones se especifica con el registro CL. SAR (Shift Arithmetic Right). Esta causa el desplazamiento del registro destino hacia la derecha en el número de posiciones especificadas. Los espacios de bits más significativos se mantienen con sus valores originales. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Desplazamiento. Nemónico SHL SAL SHR SAR Significado Desplazamiento Lógico hacia la izquierda Desplazamiento Aritmético hacia la izquierda Desplazamiento Lógico hacia la derecha Desplazamiento Aritmético hacia la derecha Instrucciones de Desplazamiento Destino Registro Registro Memoria Memoria # 1 CL 1 CL ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Formato SHL D,# SAL D,# SHR D,# SAR D,# Instrucciones de Rotación. Este grupo de instrucciones es similar a las de desplazamiento. Su diferencia radica en el hecho de que los bits desplazados no se pierden, sino que pasan a rellenar los espacios creados al momento de la rotación. La rotación puede ser hacia la derecha o hacia la izquierda. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Rotación. ROL (Rotate Left). Esta causa la rotación del destino hacia la izquierda en el número de posiciones especificadas. Cada bit más significativo en la extrema izquierda desplazado pasa a llenar el espacio disponible del bit menos significativo a la extrema derecha. ROR (Rotate Right). Esta causa la rotación del destino hacia la derecha en el número de posiciones especificadas. Cada bit menos significativo en la extrema derecha desplazado pasa a llenar el espacio disponible del bit más significativo a la extrema izquierda. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Rotación. RCL (Rotate Left through Carry). Trabaja de manera igual a la instrucción ROL, excepto que la rotación se hace incluyendo el carry flag. RCR (Rotate Right through Carry). Trabaja de manera igual a la instrucción ROR, excepto que la rotación se hace incluyendo el carry flag. Nemónico ROL ROR RCL RCR Significado Formato Rotación hacia la izquierda Rotación hacia la derecha Rotación hacia la izquierda a través del carry Rotación hacia la derecha a través del carry Instrucciones de Rotación Destino # Registro, Memoria Registro, Memoria 1 CL ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. ROL D,# ROR D,# RCL D,# RCR D,# Instrucciones de Control de Flag. LAHF (Load AH from flags). Se usa para leer los flags y enviar el resultado al registro AH. SAHF (Store AH into flags). Se usa para cambiar los flags con el valor establecido en el registro AH. CLC (Clear Carry Flag). Manda un 0 lógico al flag del carry. STC (Set Carry Flag). Manda un 1 lógico al flag del carry. CMC (Complement Carry Flag). Complementa el valor del flag del carry. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Control de Flag. CLI (Clear Interrupt Flag). Manda un 0 lógico al flag de interrupciones. Esto inhabilita la generación de interrupciones. STI (Set Interrupt Flag). Manda un 1 lógico al flag de interrupciones. Esto permite al procesador aceptar interrupciones que se generen. Nemónico LAHF SAHF CLC STC CMC CLI STI Significado Cargar AH con los flags. Escribir en los flags desde AH. Limpiar el flag del carry. Setear el flag del carry. Complementar el flag del carry. Limpiar el flag de interrupciones. Setear el flag de interrupciones. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Formato LAHF SAHF CLC STC CMC CLI STI Instrucción de Comparación. La instrucción de comparación permite determinar la relacion entre dos números, para saber si son iguales, si uno es mayor o menor al otro, etc. CMP (Compare). Compara el valor de dos números que pueden ser de 8 bits o de 16 bits. Nemónico CMP Significado Comparar Formato CMP D,S Destino Fuente Registro Registro Memoria Registro Memoria Acumulador Registro Memoria Registro Inmediato Inmediato Inmediato ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Salto. Existen dos tipos de instrucciones de salto: Las de salto incondicional: el salto ocurre independientemente de las condiciones existentes. Esto significa que la instrucción se ejecuta y el salto es llevado a cabo, cambiando la secuencia del programa. Las de salto condicional: las condiciones existentes determinan si el salto debe o no debe ocurrir. Si se cumplen las condiciones establecidas, el salto es llevado a cabo; de lo contrario, la ejecución del programa continúa con la próxima instrucción en la secuencia del programa. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Salto. 1. Salto Incondicional. Hay dos tipos de básicos de salto incondicional. El primero es el Intrasegment Jump, que se limita a direcciones comprendidas dentro del Segmento de Código actual. El segundo es el Intersegment Jump, que permite el salto desde un Segmento de Código a otro. JMP (Jump). Cuando se ejecuta, se carga el IP con un valor que combinado con el CS determina la dirección de la próxima instrucción que debe ejecutarse. Nemónico JMP Significado Salto Incondicional Formato JMP Operando Operando Label Mem 16 Reg 16 Mem 32 ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Salto. 2. Salto Condicional. Estas son las instrucciones de salto condicional: Nemónico Jcc Nemónico JA JAE JB JBE JC JCXZ JE JG JGE JL JLE JNA JNAE JNB JNBE JNC Significado Formato Salto Condicional Significado Por encima de Por encima o igual a Por debajo de Por debajo o igual a Carry El Registro CX es cero Igual Mayor Mayor o Igual Menor Menor o Igual No por encima de No por encima ni igual a No por debajo de No por debajo ni igual a No Carry Jcc Operando Nemónico JNE JNG JNGE JNL JNLE JNO JNP JNS JNZ JO JP JPE JPO JS JZ ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Significado No Igual No Mayor No Mayor ni Igual No Menor No Menor ni Igual No Overflow No Paridad No Signo No Cero Overflow Paridad Paridad Par Paridad Impar Signo Cero Instrucciones de Manejo de Subrutinas. Una subrutina es un segmento especial de programa que puede ser invocado para su ejecución desde cualquier punto del programa principal. Para el manejo de subrutinas se tienen las siguientes instrucciones: CALL (Subroutine Call). Es usada para invocar la ejecución de la subrutina especificada en el operando. RET (Return). Es necesaria para retornar el control de vuelta hacia el programa principal luego de la ejecución de la subrutina. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Manejo de Subrutinas. Nemónico CALL RET Significado Llamado de Subrutina Retorno desde Subrutina Formato Operación La ejecución del programa continúa en la dirección de la subrutina especificada en el CALL Operando operando. Debe guardarse cierta información del programa principal, como el IP y en algunos casos el CS. RET Retorna al programa principal restaurando el IP y el CS en caso de ser necesario. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones PUSH y POP. Al invocar la ejecución de una subrutina, es necesario salvar el contenido de algunos registros o parámetros del programa principal. Esto puede lograrse cargándolos en el Stack Segment. Para esto se tienen las siguientes instrucciones: PUSH (Push into the Stack). Es usada para salvar parámetros en el Stack. POP (Pop from the Stack). Es usada para recuperar parámetros desde el Stack. Nemónico PUSH POP PUSHF POPF Significado Salvar Word en el Stack Recuperar Word desde el Stack Salvar flags en el Stack Recuperar flags desde el Stack ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Formato PUSH S POP D PUSHF POPF Instrucciones de Manejo de Loops. Existen 3 instrucciones dedicadas a la implementación de loops: LOOP (Loop). Trabaja tomando en cuenta el registro CX, el cual debe contener el número de veces que debe repetirse el loop. Cada vez que se ejecuta la instrucción, el contenido de CX se decrementa en uno (1) y se revisa para determinar si su valor es cero (0). Cuando CX es cero se completa el loop y se ejecuta la instrucción que sigue de manera secuencial a esta. Mientras CX no es cero, el programa ejecuta la instrucción que contiene el label especificado en la instrucción LOOP. LOOPE/LOOPZ (Loop while equal / Loop while zero). Se ejecuta de manera similar a la instrucción LOOP, pero revisa además otra condición: el flag de cero (ZF). El loop terminará cuando CX sea cero ó ZF sea cero. ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Instrucciones de Manejo de Loops. LOOPNE/LOOPNZ (Loop while not equal / Loop while not zero). Se ejecuta de manera similar a la instrucción LOOPE/LOOPZ. El loop terminará cuando CX sea cero (0) ó ZF sea uno (1). Nemónico LOOP LOOPE/LOOPZ LOOPNE/LOOPNZ Significado Loop Loop mientras hasta que sea igual o sea cero Loop mientras sea igual o sea cero ITT-327. Unidad III: Lenguaje de Programación Ensamblador. Profesor Julio Ferreira. Formato LOOP Label LOOPE/LOOPZ Label LOOPNE/LOOPNZ Label