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:- MOV reg,{reg|mem|inmed}
- MOV mem,{reg|inmed}
- MOV {reg16|mem16},{CS|DS|ES|SS}
- 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.
- 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.
- 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.
INSTRUCCIONES DE MANIPULACION DE CADENAS:
- MOVSB
- Copiar un byte de la cadena fuente al destino.
Operación:- ES:[DI] <- DS:[SI] (un byte)
- DI <- DI±1
- SI <- SI±1
- MOVSW
- Copiar dos bytes de la cadena fuente al destino.
Operación:- ES:[DI] <- DS:[SI] (dos bytes)
- DI <- DI±2
- SI <- SI±2
- LODSB
- Poner en el acumulador un byte de la cadena fuente.
Operación:- AL <- DS:[SI] (un byte)
- SI <- SI±1
- LODSW
- Poner en el acumulador dos bytes de la cadena fuente.
Operación:- AX <- DS:[SI] (dos bytes)
- SI <- SI±2
- STOSB
- Almacenar en la cadena destino un byte del acumulador.
Operación:- ES:[DI] <- AL (un byte)
- DI <- DI±1
- STOSW
- Almacenar en la cadena destino dos bytes del acumulador.
Operación:- ES:[DI] <- AX (dos bytes)
- DI <- DI±2
- CMPSB
- Comparar un byte de la cadena fuente con el destino.
Operación:- DS:[SI] - ES:[DI] (Un byte, afecta sólo los flags)
- DI <- DI±1
- SI <- SI±1
- CMPSW
- Comparar dos bytes de la cadena fuente con el destino.
Operación:- DS:[SI] - ES:[DI] (Dos bytes, afecta sólo los flags)
- DI <- DI±2
- SI <- SI±2
- SCASB
- Comparar un byte del acumulador con la cadena destino.
Operación:- AL - ES:[DI] (Un byte, afecta sólo los flags)
- DI <- DI±1
- SCASW
- Comparar dos bytes del acumulador con la cadena destino.
Operación:- AX - ES:[DI] (Dos byte, afecta sólo los flags)
- DI <- DI±2
Prefijo para las instrucciones MOVSB, MOVSW, LODSB, LODSW, STOSB y STOSW:
- REP: Repetir la instrucción CX veces.
- 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.
- 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]
- 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.
- 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).
- 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.
- 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:
Publicar un comentario