martes, 12 de diciembre de 2006

Instrucciones del 8086/8088

INSTRUCCIONES DE TRANSFERENCIA DE DATOS (No afectan flags)

MOV dest,src
Copia el contenido del operando fuente (src) en el destino (dest).
Operación: dest <- src
Las posibilidades son:
  1. MOV reg,{reg|mem|inmed}
  2. MOV mem,{reg|inmed}
  3. MOV {reg16|mem16},{CS|DS|ES|SS}
  4. MOV {DS|ES|SS},{reg16|mem16}

PUSH src
Pone el valor en el tope del stack.
Operación: SP <- SP - 2, [SP+1:SP] <- src donde src = {reg16|mem16|CS|DS|ES|SS}.

POP dest
Retira el valor del tope del stack poniéndolo en el lugar indicado.
Operación: dest <- [SP+1:SP], SP <- SP + 2 donde dest = {reg16|mem16|DS|ES|SS}.

XCHG reg,{reg|mem}
Intercambia ambos valores.

IN {AL|AX},{DX|inmed (1 byte)}
Pone en el acumulador el valor hallado en el port indicado.

OUT {DX|inmed (1 byte)},{AL|AX}
Pone en el port indicado el valor del acumulador.

XLAT
Realiza una operación de traducción de un código de un byte a otro código de un byte mediante una tabla.
Operación: AL <- [BX+AL]

LEA reg,mem
Almacena la dirección efectiva del operando de memoria en un registro.
Operación: reg <- dirección mem

LDS reg,mem32
Operación: reg <- [mem], DS <- [mem+2]

LES reg,mem32
Operación: reg <- [mem], ES <- [mem+2]

LAHF
Copia en el registro AH la imagen de los ocho bits menos significativos del registro de indicadores.
Operación: AH <- SF:ZF:X:AF:X:PF:X:CF

SAHF
Almacena en los ocho bits menos significativos del registro de indicadores el valor del registro AH.
Operación: SF:ZF:X:AF:X:PF:X:CF <- AH

PUSHF
Almacena los flags en la pila.
Operación: SP <- SP - 2, [SP+1:SP] <- Flags.

POPF
Pone en los flags el valor que hay en la pila.
Operación: Flags <- [SP+1:SP], SP <- SP + 2

INSTRUCCIONES ARITMETICAS (Afectan los flags AF, CF, OF, PF, SF, ZF)

ADD dest,src
Operación: dest <- dest + src.

ADC dest,src
Operación: dest <- dest + src + CF.

SUB dest,src
Operación: dest <- dest - src.

SBB dest,src
Operación: dest <- dest - src - CF.

CMP dest,src
Operación: dest - src (sólo afecta flags).

INC dest
Operación: dest <- dest + 1 (no afecta CF).

DEC dest
Operación: dest <- dest - 1 (no afecta CF).

NEG dest
Operación: dest <- - dest.

donde dest = {reg|mem} y src = {reg|mem|inmed} no pudiendo ambos operandos estar en memoria.

DAA
Corrige el resultado de una suma de dos valores BCD empaquetados en el registro AL (debe estar inmediatamente después de una instrucción ADD o ADC). OF es indefinido después de la operación.

DAS
Igual que DAA pero para resta (debe estar inmediatamente después de una instrucción SUB o SBB).

AAA
Lo mismo que DAA para números BCD desempaquetados.

AAS
Lo mismo que DAS para números BCD desempaquetados.

AAD
Convierte AH:AL en BCD desempaquetado a AL en binario.
Operación: AL <- AH * 0Ah + AL, AH <- 0. Afecta PF, SF, ZF, mientras que AF, CF y OF quedan indefinidos.

AAM
Convierte AL en binario a AH:AL en BCD desempaquetado.
Operación: AH <- AL / 0Ah, AL <- AL mod 0Ah. Afecta PF, SF, ZF, mientras que AF, CF y OF quedan indefinidos.

MUL {reg8|mem8}
Realiza una multiplicación con operandos no signados de 8 por 8 bits.
Operación: AX <- AL * {reg8|mem8}. CF=OF=0 si AH = 0, CF=OF=1 en caso contrario. AF, PF, SF, ZF quedan indefinidos.

MUL {reg16|mem16}
Realiza una multiplicación con operandos no signados de 16 por 16 bits.
Operación: DX:AX <- AX * {reg16|mem16}. CF=OF=0 si DX = 0, CF=OF=1 en caso contrario. AF, PF, SF, ZF quedan indefinidos.

IMUL {reg8|mem8}
Realiza una multiplicación con operandos con signo de 8 por 8 bits.
Operación: AX <- AL * {reg8|mem8} realizando la multiplicación con signo. CF = OF = 0 si el resultado entra en un byte, en caso contrario valdrán 1. AF, PF, SF, ZF quedan indefinidos.

IMUL {reg16|mem16}
Realiza una multiplicación con operandos con signo de 16 por 16 bits.
Operación: DX:AX <- AX * {reg16|mem16} realizando la multiplicación con signo. CF = OF = 0 si el resultado entra en dos bytes, en caso contrario valdrán 1. AF, PF, SF, ZF quedan indefinidos.

CBW
Extiende el signo de AL en AX. No se afectan los flags.

CWD
Extiende el signo de AX en DX:AX. No se afectan flags.

INSTRUCCIONES LOGICAS (Afectan AF, CF, OF, PF, SF, ZF)

AND dest,src
Operación: dest <- dest and src.

TEST dest,src
Operación: dest and src. Sólo afecta flags.

OR dest,src
Operación: dest <- dest or src.

XOR dest,src
Operación: dest <- dest xor src.

Las cuatro instrucciones anteriores ponen CF = OF = 0, AF queda indefinido y PF, SF y ZF dependen del resultado.

NOT dest
Operación: dest <- Complemento a 1 de dest. No afecta los flags.

SHL/SAL dest,{1|CL}
Realiza un desplazamiento lógico o aritmético a la izquierda.

SHR dest,{1|CL}
Realiza un desplazamiento lógico a la derecha.

SAR dest,{1|CL}
Realiza un desplazamiento aritmético a la derecha.

ROL dest,{1|CL}
Realiza una rotación hacia la izquierda.

ROR dest,{1|CL}
Realiza una rotación hacia la derecha.

RCL dest,{1|CL}
Realiza una rotación hacia la izquierda usando el CF.

RCR dest,{1|CL}
Realiza una rotación hacia la derecha usando el CF.

En las siete instrucciones anteriores la cantidad de veces que se rota o desplaza puede ser un bit o la cantidad de bits indicado en CL.

INSTRUCCIONES DE MANIPULACION DE CADENAS:

MOVSB
Copiar un byte de la cadena fuente al destino.
Operación:
  1. ES:[DI] <- DS:[SI] (un byte)
  2. DI <- DI±1
  3. SI <- SI±1

MOVSW
Copiar dos bytes de la cadena fuente al destino.
Operación:
  1. ES:[DI] <- DS:[SI] (dos bytes)
  2. DI <- DI±2
  3. SI <- SI±2

LODSB
Poner en el acumulador un byte de la cadena fuente.
Operación:
  1. AL <- DS:[SI] (un byte)
  2. SI <- SI±1

LODSW
Poner en el acumulador dos bytes de la cadena fuente.
Operación:
  1. AX <- DS:[SI] (dos bytes)
  2. SI <- SI±2

STOSB
Almacenar en la cadena destino un byte del acumulador.
Operación:
  1. ES:[DI] <- AL (un byte)
  2. DI <- DI±1

STOSW
Almacenar en la cadena destino dos bytes del acumulador.
Operación:
  1. ES:[DI] <- AX (dos bytes)
  2. DI <- DI±2

CMPSB
Comparar un byte de la cadena fuente con el destino.
Operación:
  1. DS:[SI] - ES:[DI] (Un byte, afecta sólo los flags)
  2. DI <- DI±1
  3. SI <- SI±1

CMPSW
Comparar dos bytes de la cadena fuente con el destino.
Operación:
  1. DS:[SI] - ES:[DI] (Dos bytes, afecta sólo los flags)
  2. DI <- DI±2
  3. SI <- SI±2

SCASB
Comparar un byte del acumulador con la cadena destino.
Operación:
  1. AL - ES:[DI] (Un byte, afecta sólo los flags)
  2. DI <- DI±1

SCASW
Comparar dos bytes del acumulador con la cadena destino.
Operación:
  1. AX - ES:[DI] (Dos byte, afecta sólo los flags)
  2. DI <- DI±2

En todos los casos el signo + se toma si el indicador DF vale cero. Si vale 1 hay que tomar el signo -.

Prefijo para las instrucciones MOVSB, MOVSW, LODSB, LODSW, STOSB y STOSW:

  • REP: Repetir la instrucción CX veces.

Prefijos para las instrucciones CMPSB, CMPSW, SCASB, SCASW:
  • REPZ/REPE: Repetir mientras que sean iguales hasta un máximo de CX veces.

  • REPNZ/REPNE: Repetir mientras que sean diferentes hasta un máximo de CX veces.

INSTRUCCIONES DE TRANSFERENCIA DE CONTROL (No afectan los flags):

JMP label
Saltar hacia la dirección label.

CALL label
Ir al procedimiento cuyo inicio es label. Para llamadas dentro del mismo segmento equivale a PUSH IP: JMP label, mientras que para llamadas entre segmentos equivale a PUSH CS: PUSH IP: JMP label.
RET
Retorno de procedimiento.
RET inmed
Retorno de procedimiento y SP <- SP + inmed.
Variaciones de la instrucción de retorno:
RETN [inmed]
En el mismo segmento de código. Equivale a POP IP [:SP <- SP + inmed].
RETF [inmed]
En otro segmento de código. Equivale a POP IP: POP CS [:SP <- SP + inmed]

Saltos condicionales aritméticos (usar después de CMP):

  • Aritmética signada (con números positivos, negativos y cero)

    JL etiqueta/JNGE etiqueta
    Saltar a etiqueta si es menor.

    JLE etiqueta/JNG etiqueta
    Saltar a etiqueta si es menor o igual.

    JE etiqueta
    Saltar a etiqueta si es igual.

    JNE etiqueta
    Saltar a etiqueta si es distinto.

    JGE etiqueta/JNL etiqueta
    Saltar a etiqueta si es mayor o igual.

    JG etiqueta/JNLE etiqueta
    Saltar a etiqueta si es mayor.

  • Aritmética sin signo (con números positivos y cero)

    JB etiqueta/JNAE etiqueta
    Saltar a etiqueta si es menor.

    JBE etiqueta/JNA etiqueta
    Saltar a etiqueta si es menor o igual.

    JE etiqueta
    Saltar a etiqueta si es igual.

    JNE etiqueta
    Saltar a etiqueta si es distinto.

    JAE etiqueta/JNB etiqueta
    Saltar a etiqueta si es mayor o igual.

    JA etiqueta/JNBE etiqueta
    Saltar a etiqueta si es mayor.

Saltos condicionales según el valor de los indicadores:

JC label
Saltar si hubo arrastre/préstamo (CF = 1).

JNC label
Saltar si no hubo arrastre/préstamo (CF = 0).

JZ label
Saltar si el resultado es cero (ZF = 1).

JNZ label
Saltar si el resultado no es cero (ZF = 0).

JS label
Saltar si el signo es negativo (SF = 1).

JNS label
Saltar si el signo es positivo (SF = 0).

JP/JPE label
Saltar si la paridad es par (PF = 1).

JNP/JPO label
Saltar si la paridad es impar (PF = 0).

Saltos condicionales que usan el registro CX como contador:

LOOP label
Operación: CX <- CX-1. Saltar a label si CX<>0.

LOOPZ/LOOPE label
Operación: CX <- CX-1. Saltar a label si CX <> 0 y ZF = 1.

LOOPNZ/LOOPNE label
Operación: CX <- CX-1. Saltar a label si CX <> 0 y ZF = 0.

JCXZ label
Operación: Salta a label si CX = 0.

Interrupciones:

INT número
Salva los flags en la pila, hace TF=IF=0 y ejecuta la interrupción con el número indicado.

INTO
Interrupción condicional. Si OF = 1, hace INT 4.

IRET
Retorno de interrupción. Restaura los indicadores del stack.

INSTRUCCIONES DE CONTROL DEL PROCESADOR

CLC
CF <- 0.
STC
CF <- 1.
CMC
CF <- 1 - CF.
NOP
No hace nada.
CLD
DF <- 0 (Dirección ascendente).
STD
DF <- 1 (Dirección descendente).
CLI
IF <- 0 (Deshabilita interrupciones enmascarables).
STI
IF <- 1 (Habilita interrupciones enmascarables).
HLT
Detiene la ejecución del procesador hasta que llegue una interrupción externa.
WAIT
Detiene la ejecución del procesador hasta que se active el pin TEST del mismo.
LOCK
Prefijo de instrucción que activa el pin LOCK del procesador.

OPERADORES

Operadores aritméticos

+, -, *, /, MOD (resto de la división).

Operadores lógicos AND, OR, XOR, NOT, SHR, SHL.
Para los dos últimos operadores, el operando derecho indica la cantidad de bits a desplazar hacia la derecha (para SHR) o izquierda (para SHL) el operando izquierdo.

Operadores relacionales

Valen cero si son falsos y 65535 si son verdaderos.

  • EQ: Igual a.
  • NE: Distinto de.
  • LT: Menor que.
  • GT: Mayor que.
  • LE: Menor o igual a.
  • GE: Mayor o igual a.

Operadores analíticos

Descomponen operandos que representan direcciones de memoria en sus componentes.

SEG memory-operand: Retorna el valor del segmento.

OFFSET memory-operand: Retorna el valor del offset.

TYPE memory-operand: Retorna un valor que representa el tipo de operando: BYTE = 1, WORD = 2, DWORD = 4 (para direcciones de datos) y NEAR = -1 y FAR = -2 (para direcciones de instrucciones).

LENGHT memory-operand: Se aplica solamente a direcciones de datos. Retorna un valor numérico para el número de unidades (bytes, words o dwords) asociados con el operando. Si el operando es una cadena retorna el valor 1.

Ejemplo: Dada la directiva PALABRAS DW 50 DUP (0), el valor de LENGHT PALABRAS es 50, mientras que dada la directiva CADENA DB "cadena" el valor de LENGHT CADENA es 1.

SIZE memory-operand: LENGHT memory-operand * TYPE memory-operand.

Operadores sintéticos

Componen operandos de direcciones de memoria a partir de sus componentes.

type PTR memory-operand: Compone un operando de memoria que tiene el mismo segmento y offset que el especificado en el operando derecho pero con el tipo (BYTE, WORD, DWORD, NEAR o FAR) especificado en el operando izquierdo.

THIS type: Compone un operando de memoria con el tipo especificado que tiene el segmento y offset que la próxima ubicación a ensamblar.

Operadores de macros

Son operadores que se utilizan en las definiciones de macros. Hay cinco: &, <>, !, % y ;;.

&parámetro: reemplaza el parámetro con el valor actual del argumento.

<texto>: trata una serie de caracteres como una sola cadena. Se utiliza cuando el texto incluye comas, espacios u otros símbolos especiales.

!carácter: trata el carácter que sigue al operador ! como un carácter en vez de un símbolo o separador.

%texto: trata el texto que sigue a continuación del operador % como una expresión. El ensamblador calcula el valor de la expresión y reemplaza el texto por dicho valor.

sentencia ;;comentario: Permite definir comentarios que aparecerán en la definición de la macro pero no cada vez que éste se invoque en el listado fuente que genera el ensamblador.


No hay comentarios: