Capítulo IV

Click here to load reader

  • date post

    06-Jul-2015
  • Category

    Documents

  • view

    331
  • download

    0

Embed Size (px)

Transcript of Capítulo IV

Captulo IV: JUEGO DE INSTRUCCIONES 80x86

4.1. - DESCRIPCIN COMPLETA DE LAS INSTRUCCIONES. Nota: en el efecto de las instrucciones sobre el registro de estado se utilizar la siguiente notacin: - bit no modificado ? desconocido o indefinido x modificado segn el resultado de la operacin 1 puesto siempre a 1 0 puesto siempre a 0

4.1.1. - INSTRUCCIONES DE CARGA DE REGISTROS Y DIRECCIONES.

y MOV (transferencia) Sintaxis: MOV dest, origen.Indicadores: OF DF IF TF SF ZF AF PF CF

Transfiere datos de longitud byte o palabra del operando origen al operando destino. Pueden ser operando origen y operando destino cualquier registro o posicin de memoria direccionada de las formas ya vistas, con la nica condicin de que origen y destino tengan la misma dimensin. Existen ciertas limitaciones, como que los registros de segmento no admiten el direccionamiento inmediato: es incorrecto MOV DS,4000h; pero no lo es por ejemplo MOV DS,AX o MOV DS,VARIABLE. No es posible, as mismo, utilizar CS como destino (es incorrecto hacer MOV CS,AX aunque pueda admitirlo algn ensamblador). Al hacer MOV hacia un registro de segmento, las interrupciones quedan inhibidas hasta despus de ejecutarse la siguiente instruccin (8086/88 de 1983 y procesadores posteriores).Ejemplos: mov mov mov ds,ax bx,es:[si] si,offset dato

En el ltimo ejemplo, no se coloca en SI el valor de la variable dato sino su direccin de memoria o desplazamiento respecto al segmento de datos. En otras palabras, SI es un puntero a dato pero no es dato. En el prximo captulo se ver cmo se declaran las variables.

y XCHG (intercambiar) Sintaxis: XCHG destino, origenIndicadores: OF DF IF TF SF ZF AF PF CF

Intercambia el contenido de los operandos origen y destino. No pueden utilizarse registros de segmentos como operandos.Ejemplo: xchg xchg bl,ch mem_pal,bx

y XLAT (traduccin) Sintaxis: XLAT tablaIndicadores: OF DF IF TF SF ZF AF PF CF

Se utiliza para traducir un byte del registro AL a un byte tomado de la tabla de traduccin. Los datos se toman desde una direccin de la tabla correspondiente a BX + AL, donde bx es un puntero a el comienzo de la tabla y AL es un ndice. Indicar tabla al lado de xlat es slo una redundancia opcional.Ejemplo: mov mov xlat bx,offset tabla al,4

y LEA (carga direccin efectiva) Sintaxis: LEA destino, origenIndicadores: OF DF IF TF SF ZF AF PF CF

Transfiere el desplazamiento del operando fuente al operando destino. Otras instrucciones pueden a continuacin utilizar el registro como desplazamiento para acceder a los datos que constituyen el objetivo. El operando destino no puede ser un registro de segmento. En general, esta instruccin es equivalente a MOV destino,OFFSET fuente y de

hecho los buenos ensambladores (TASM) la codifican como MOV para economizar un byte de memoria. Sin embargo, LEA es en algunos casos ms potente que MOV al permitir indicar registros de ndice y desplazamiento para calcular el offset:lea dx,datos[si]

En el ejemplo de arriba, el valor depositado en DX es el offset de la etiqueta datos ms el registro SI. Esa sola instruccin es equivalente a estas dos:mov add dx,offset datos dx,si

y LDS (carga un puntero utilizando DS) Sintaxis: LDS destino, origenIndicadores: OF DF IF TF SF ZF AF PF CF

Traslada un puntero de 32 bits (direccin completa de memoria compuesta por segmento y desplazamiento), al destino indicado y a DS. A partir de la direccin indicada por el operando origen, el procesador toma 4 bytes de la memoria: con los dos primeros forma una palabra que deposita en destino y, con los otros dos, otra en DS.Ejemplo: punt dd lds 12345678h si,punt

Como resultado de esta instruccin, en DS:SI se hace referencia a la posicin de memoria 1234h:5678h; 'dd' sirve para definir una variable larga de 4 bytes (denominada punt en el ejemplo) y ser explicado en el captulo siguiente.

y LES (carga un puntero utilizando ES) Sintaxis: LES destino, origen Esta instruccin es anloga a LDS, pero utilizando ES en lugar de DS.

y LAHF (carga AH con los indicadores) Sintaxis: LAHFIndicadores: OF DF IF TF SF ZF AF PF CF

Carga los bits 7, 6, 4, 2 y 0 del registro AH con el contenido de los indicadores SF, ZF, AF, PF Y CF respectivamente. El contenido de los dems bits queda sin definir.

y SAHF (copia AH en los indicadores) Sintaxis: SAHFIndicadores: x OF x DF x IF x TF x SF ZF AF PF CF

Transfiere el contenido de los bits 7, 6, 4, 2 y 0 a los indicadores SF, ZF, AF, PF y CF respectivamente.

4.1.2. - INSTRUCCIONES DE MANIPULACIN DEL REGISTRO DE ESTADO.

y CLC (baja el indicador de acarreo) Sintaxis: CLCIndicadores: OF DF IF TF 0 SF ZF AF PF CF

Borra el indicador de acarreo (CF) sin afectar a ninguno otro.

y CLD (baja el indicador de direccin) Sintaxis: CLDIndicadores: 0 OF DF IF TF SF ZF AF PF CF

Pone a 0 el indicador de direccin DF, por lo que los registros SI y/o DI se autoincrementan en las operaciones de cadenas, sin afectar al resto de los indicadores. Es NECESARIO colocarlo antes de las instrucciones de manejo de cadenas si no se conoce con seguridad el valor de DF. Vase STD.

y CLI (baja indicador de interrupcin) Sintaxis: CLIIndicadores: OF DF IF 0 TF SF ZF AF PF CF -

Borra el indicador de activacin de interrupciones IF, lo que desactiva las interrupciones enmascarables. Es muy conveniente hacer esto antes de modificar la pareja SS:SP en los 8086/88 anteriores a 1983 (vase comentario en la instruccin MOV), o antes de cambiar un vector de interrupcin sin el apoyo del DOS. Generalmente las interrupciones slo se inhiben por breves instantes en momentos crticos. Vase tambin STI.

y CMC (complementa el indicador de acarreo) Sintaxis: CMCIndicadores: OF DF IF TF x SF ZF AF PF CF

Complementa el indicador de acarreo CF invirtiendo su estado.

y STC (pone a uno el indicador de acarreo) Sintaxis: STCIndicadores: OF DF IF TF 1 SF ZF AF PF CF

Pone a 1 el indicador de acarreo CF sin afectar a ningn otro indicador.

y STD (pone a uno el indicador de direccin) Sintaxis: STDIndicadores: 1 OF DF IF TF SF ZF AF PF CF

Pone a 1 el indicador de direccin DF, por lo que los registros SI y/o DI se autodecrementan en las operaciones de cadenas, sin afectar al resto de los indicadores. Es NECESARIO colocarlo antes de las instrucciones de manejo de cadenas si no se conoce con seguridad el estado de DF. Vase tambin CLD.

y STI (pone a uno el indicador de interrupcin) Sintaxis: STIIndicadores: 1 OF DF IF TF SF ZF AF PF CF

Pone a 1 la bandera de desactivacin de interrupciones IF y activa las interrupciones enmascarables. Una interrupcin pendiente no es reconocida, sin embargo, hasta despus de ejecutar la instruccin que sigue a STI. Vase tambin CLI.

4.1.3. - INSTRUCCIONES DE MANEJO DE LA PILA.

y POP (extraer de la pila) Sintaxis: POP destinoIndicadores: OF DF IF TF SF ZF AF PF CF

Transfiere el elemento palabra que se encuentra en lo alto de la pila (apuntado por SP) al operando destino que a de ser tipo palabra, e incrementa en dos el registro SP. La instruccin POP CS, poco til, no funciona correctamente en los 286 y superiores.Ejemplos: pop pop ax pepe

y PUSH (introduce en la pila) Sintaxis: PUSH origenIndicadores: OF DF IF TF SF ZF AF PF CF

Decrementa el puntero de pila (SP) en 2 y luego transfiere la palabra especificada en el operando origen a la cima de la pila. El registro CS aqu s se puede especificar como origen, al contrario de lo que afirman algunas publicaciones.Ejemplo: push cs

y POPF (extrae los indicadores de la pila) Sintaxis: POPFIndicadores: x x x x x OF x DF x IF x TF x SF ZF AF PF CF

Traslada al registro de los indicadores la palabra almacenada en la cima de la pila; a continuacin el puntero de pila SP se incrementa en dos.

y PUSHF (introduce los indicadores en la pila) Sintaxis: PUSHFIndicadores: OF DF IF TF SF ZF AF PF CF

Decrementa en dos el puntero de pila y traslada a la cima de la pila el contenido de los indicadores.

4.1.4. - INSTRUCCIONES DE TRANSFERENCIA DE CONTROL. Incondicional y CALL (llamada a subrutina) Sintaxis: CALL destinoIndicadores: OF DF IF TF SF ZF AF PF CF

Transfiere el control del programa a un procedimiento, salvando previamente en la pila la direccin de la instruccin siguiente, para poder volver a ella una vez ejecutado el procedimiento. El procedimiento puede estar en el mismo segmento (tipo NEAR) o en otro segmento (tipo FAR). A su vez la llamada puede ser directa a una etiqueta (especificando el tipo de llamada NEAR -por defecto- o FAR) o indirecta, indicando la direccin donde se encuentra el puntero. Segn la llamada sea cercana o lejana, se almacena en la pila una direccin de retorno de 16 bits o dos palabras de 16 bits indicando en este ltimo caso tanto el offset (IP) como el segmento (CS) a donde volver.

Ejemplos: dir

call dd call

proc1 0f000e987h dword ptr dir

En el segundo ejemplo, la variable dir almacena la direccin a donde saltar. De esta ltima manera -conociendo su direccin- puede llamarse tambin a un vector de interrupcin, guardando previamente los flags en la pila (PUSHF), porque la rutina de interrupcin retornar (con IRET en vez de con RETF) sacndolos.

y JMP (salto) Sintaxis: JMP direccin o JMP SHORT direccinIndicadores: OF DF IF TF SF ZF AF PF CF

Transfiere el control incondicionalmente a la direccin indicada en el operando. La bifurcacin puede ser tambin directa o indirecta como anteriormente vimos, pero adems puede ser corta (tipo SHORT) con un desplazamiento comprendido entre -128 y 127; o larga, con un desplazamiento de dos bytes con signo. Si se hace un JMP SHORT y no llega el salto (porque est demasiado alejada esa etiqueta) el ensamblador dar error. Los buenos ensambladores (como TASM) cuando dan dos pasadas colocan all d