Facultad de Ciencias de la Ingeniería Escuela de Ingeniería Civil Informática Arquitectura de Computadores II El lenguaje Ensamblador Es un tipo de lenguaje de bajo nivel utilizado para escribir programas de computadora, y constituye la representación más directa del código máquina específico para cada arquitectura de computadoras legible por un programador. Fue usado ampliamente en el pasado para el desarrollo de software, pero actualmente sólo se utiliza en contadas ocasiones, especialmente cuando se requiere la manipulación directa del hardware o se pretenden rendimientos inusuales de los equipos. Lenguaje Un programa escrito en lenguaje ensamblador consiste en una serie de instrucciones que corresponden al flujo de órdenes ejecutables que pueden ser cargadas en la memoria de una computadora. Por ejemplo, un procesador x86 puede ejecutar la siguiente instrucción binaria como se expresa en código máquina: 1 Binario: 10110000 01100001 (Hexadecimal: 0xb061) La representación equivalente en ensamblador es más fácil de recordar: 1 mov al, 061h Esta instrucción significa: 1 Mueva el valor hexadecimal 61 (97 decimal) al registro "al". El mnemónico "mov" es un código de operación u "opcode" , elegido por los diseñadores de la colección de instrucciones para abreviar "move" (mover).- El opcode es seguido por una lista de argumentos o parámetros, completando una instrucción de ensamblador típica. Las operaciones disponibles en la mayoría de los conjuntos de instrucciones incluye: 1 2 mover o llenar un registro con un valor constante o mover datos de una posición de memoria a un registro o viceversa o escribir y leer datos de dispositivos computar o sumar, restar, multiplicar o dividir los valores de dos registros, colocando el resultado en uno de ellos on en otro registro Los registros de la familia 80x86 sobre los que se realizaran las operaciones son: AX BX CX DX SI DI BP SP IP CS DS ES SS Acumulator Register Base Index Register Counter Register Data Register Source Index Destination Index Base Pointer Stack Pointer Instruction Pointer Current Segment Data Segment Extra Segment Stack Segment Acumulador Índice Base Contador Dato Índice de Origen Índice de Destino Puntero Base Puntero de Pila Puntero de Instrucciones Segmento Actual del Programa Segmento de Datos Segmento Extra Segmento de Pil Flags: Es un registro especial en el cual se guardan los resultados de la última operación matemática o de comparación. No se guardan los resultados numéricos, solo los de estado, es decir. CF PF AF ZF SF TF IF DF OF IOPL NT RF VM Carry Flag Parity Flag Auxiliary Flag Zero Flag Sign Flag Trap Flag Interrupt Flag Direction Flag Overflow Flag I/O Privilege Level Nested Task Flag Resume Flag Virtual Mode Flag Bandera de por Acarreo Bandera de por Paridad Bandera Auxiliar Bandera por Cero Bandera de Signo Bandera de Paso Simple Bandera de Interrupción Bandera de Dirección Bandera por Sobre flujo Solo en 286 o superior Solo en 286 o superior Solo en 386 o superior Solo en 386 o superior INSTRUCCIONES ARITMETICAS.· ADC. Adición con acarreo. Suma los operandos más 1 si está activada la bandera de acarreo (CF), El resultado lo guarda en el operando destino. Los operandos deben ser del mismo tipo (byte o palabra). Afeccta a los flags: OF, SF,ZF,AF,PF,CF ADC destino,fuente Lleva a cabo la suma de dos operandos y suma una al resultado en caso de que la bandera CF esté activada, esto es, en caso de que exista acarreo. El resultado se guarda en el operando destino. ·ADD. Adición de los operandos. El resultado lo guarda en el operando destino. Los operandos deben ser del mismo tipo (byte, palabra). Afecta alos flags: OF, SF, ZF, AF, PF, CF ADD destino,fuente ·SUB. Resta el operando fuente del operando destino y el resultado lo guarda en el operando destino. Los operandos deben ser del mismo tipo (byte, palabra). Afecta a los flags: OF, SF, ZF, AF, PF, CF SUB destino,fuente · SBB. Resta el operando fuente del operando destino teniendo en cuenta el acarreo, y el resultado lo guarda en el operando destino. Destino=destino(fuente+CF). Los operandos deben ser del mismo tipo (byte, palabra). Afecta a los flags: OF, SF, ZF, AF, PF, CF SBB destino,fuente - INC. Incrementa el operando. La instrucción suma uno al operando destino y guarda el resultado en el mismo operando destino. Afecta a los flags: OF, SF, ZF, AF, PF INC destino · DEC. Decrementa el operando. La instrucción resta uno al operando destino y guarda el resultado en el mismo operando destino. Afecta a los flags: OF, SF, ZF, AF, PF DEC destino · CMP. Compara dos operandos. Resta fuente de destino, pero no almacena el resultado. Los operandos quedan intactos pero las banderas se actualizan pudiéndose consultar a continuación mediante una instrucción de bifurcación condicional. Los operandos pueden ser del tipo byte o palabra pero siempre del mismo tipo los dos. Afecta a los flags: OF, SF, ZF, AF, AF, PF, CF CMP destino, fuente Si ZF=1 los operandos son iguales. Si CF=0 con operandos sin signo opernado1>=operando 2, no ha habido acarreo. Si CF=1 con operandos sin signo operando 1< operando 2, ha habido acarreo. Si OF=SF con operandos con signo desbordamiento del bit de signo. Si OF<>SF con operandos con signo operando 1 >= operando 2, operando 1< operando 2. INSTRUCCIONES CONDICIONALES.· Jxx. Salta si se cumple la condición. La distancia de la etiqueta está limitada por –128 y 127 bytes. Jxx desplazamiento El desplazamiento (valor con signo de 8 bits) debe estar comprendido entre – 128 y 127 bytes desde la instrucción, que es el valor de desplazamiento máximo con signo que se puede representar con 8 bits. Transfiere el control a la instrucción “IP+Desplazamiento” si se cumple la condición especificada por la instrucción. No afecta a las banderas. · Tratamiento de datos sin signo. En esas instrucciones no se considera el signo, por lo que coge el menor independientemente del signo que tenga. No afecta a las banderas. INSTRUCCIÓN JB JNAE JC JBE JNA JE JZ JNC JAE JNB JA JNE JNZ JCXZ DESCRIPCIÓN Salta si inferior Salta si no superior o igual Salta si hay carry Salta si inferior o igual Saltar si no superior Salta si es igual Salta si es 0 Salta si no hay carry Salta si superior o igual Salta si no inferior Salta si superior Salta si no igual Salta si no cero Salta si CX es 0 CONDICIÓN CF=1 CF=1 CF=1 CF=1 ó ZF=1 CF=1 ó ZF=1 ZF=1 ZF=1 CF=0 CF=0 CF=0 CF=0 y ZF=0 ZF=0 ZF=0 CX=0 · Tratamiento de datos con signo. INSTRUCCIÓN JL JNGE JLE JNG JG JNLE JGE JNL DESCRIPCIÓN Salta si es menor Salta si no es mayor ni igual Salta si menor o igual Salta si no mayor Salta si mayor Salta si no menor o igual Salta si mayor o igual Salta si no menor CONDICIÓN SF<>OF SF<>OF ZF=1 ó SF<>OF ZF=1 ó SF<>OF ZF=0 ó SF<>OF ZF=0 ó SF<>OF SF=OF SF=OF