1.INTRODUCCIÓN 2
1.1Registros internos del microprocesador (80*86 de Intel) 2
1.2La memoria del ordenador. Direccionamiento. 5
2. ELEMENTOS DE UN PROGRAMA ENSAMBLADOR 6
3. CLASIFIACIÓN DE LAS DIRECTIVAS 9
3.1 Directivas de control del ensamblador 9
3.2 Directivas para la definición de símbolos 9
3.3 Directivas para la definición de segmentos 9
3.4 Directivas para la definición de datos 10
3.5 Directivas para la definición de procedimientos 10
4. CLASIFICACIÓN DE LAS INSTRUCCIONES 11
4.1 Instrucciones de transferencia de datos(no afectan flags) 11
4.7 De ruptura de secuencia 15
5. ESTRUCTURA DE UN PROGRAMA ENSAMBLADOR 20
1.INTRODUCCIÓN
El lenguaje ensamblador fue el primer intento de sustituir el lenguaje máquina por otro más parecido al utilizado por el hombre. La transformación consistió en la sustitución de las cadenas de 1s y 0s por palabras nemotécnicas en cada una de las instrucciones en lenguaje máquina.
Por este motivo, se presentan los mismos inconvenientes que en la utilización del lenguaje máquina.
Inconvenientes:
El problema era que cada máquina tiene el suyo propio, y por lo tanto, los programas no son transportables.
Necesidad de conocer perfectamente el Hardware del equipo, ya que se trabaja directamente con direcciones de memoria y registros del microprocesador.
Incomodidad de trabajar con instrucciones elementales que provocan la descripción detallada de todas las acciones que habrá de llevar a cabo el ordenador.
Ventajas
Mínima ocupación de memoria y mínimo tiempo de ejecución en comparación con el resultado de la compilación del mismo programa escrito en otro lenguaje.
Son 14 registros de 16 bits, divididos en las siguientes categorías:
Registros de Propósito General (almacenamiento temporal)
Los registros de propósito general son el AX, BX, CX, y DX, de 16 bits. Cada uno de ellos se divide en dos registros de 8 bits, llamados AH y AL, BH y BL, CH y CL, y, DH y DL, H significando High (alto) y L significando Low (bajo), indicando la parte alta o la parte baja del registro correspondiente de 16 bits (ver esquema). Un programa podía usar tanto los registros de 16 bits como los registros de 8 bits. Aparte del uso general de los registros para hacer cálculos aritméticos y lógicos, existen instrucciones que usan estos registros con un uso particular especializado, como se indica a continuación:
-
Registro AX: El registro AX es el registro acumulador, es utilizado para operaciones que implican entrada/salida, multiplicación y división (estas dos últimas en conjunto con el registro DX)
-
Registro BX: El registro BX es el registro base. Se utiliza para indicar desplazamientos.
-
Registro CX: El registro CX es conocido como el registro contador. Puede contener un valor para controlar el número de veces que un ciclo se repite o un valor para corrimiento de bits
-
Registro DX: El registro DX es el registro de datos. En algunas operaciones se indica mediante este registro el número de puerto de entrada/salida, y en las operaciones de multiplicación y división de 16 bits se utiliza junto con el acumulador AX
Registros de Segmento
Definen áreas de 64 Kb dentro del espacio de direcciones de 1 Mb del 8086. Estas áreas pueden solaparse total o parcialmente. No es posible acceder a una posición de memoria no definida por algún segmento: si es preciso, habrá de moverse alguno.
-
Registro CS: Registro del segmento de código. Indica la posición de comienzo del segmento de código, o sea, las instrucciones del programa.
-
Registro DS: Registro del segmento de datos. Indica la posición donde empieza el segmento de datos, es decir, el área de memoria donde está almacenados los datos del programa.
-
Registro SS: Registro del segmento de la pila. Indica la posición de memoria donde empieza la pila.
-
Registro ES: Registro del segmento extra. Indica la posición de memoria donde comienza el segmento extra, un segmento de datos adicional que también se utiliza para transferencia de datos entre segmentos.
Registros Índice
Los registros SI y DI están disponibles para direccionamiento indexado y para operaciones de cadenas de caracteres.
-
Registro SI: El registro índice fuente de 16 bits es requerido por algunas operaciones con cadenas de caracteres.
-
Registro DI: El registro índice destino también es requerido por algunas operaciones con cadenas de caracteres.
Registros Apuntadores
Los registros SP (apuntador de pila) y BP (apuntador base) están asociados con el registro SS y permiten al sistema acceder a datos en el segmento de la pila.
-
Registro SP: Indica la posición de cabecera de la pila.
-
Registro BP: Indica la dirección de comienzo de la pila.
Registro Apuntador de Instrucciones
El registro IP de 16 bits contiene el desplazamiento de dirección de la siguiente instrucción que se ejecuta. El IP está asociado con el registro CS en el sentido de que el IP indica la instrucción actual dentro del segmento de código que se está ejecutando actualmente en la memoria.
Registros de Banderas
Es un registro de 16 bits, de los cuales nueve sirven para indicar el estado actual de la máquina y el resultado del procesamiento. Muchas instrucciones aritméticas y de comparación cambian el estado de las banderas y apoyándose en ellas se pueden tomar decisiones para determinar la acción subsecuente.
La tabla contiene 16 posiciones (de 0 a 15), que son los 16 bits del registro de banderas, numeradas de derecha a izquierda. La posición 0 la encontraremos a la derecha y la posición 15 a la izquierda.
–
–
–
–
OF
DF
IF
TF
SF
ZF
–
AF
–
PF
–
CF
Los bits de las banderas son las siguientes:
-
OF (overflow, desbordamiento): Indica desbordamiento del bit de mayor orden después de una operación aritmética de números con signo (1=existe overflow; 0=no existe overflow). Para operaciones sin signo, no se toma en cuenta esta bandera.
-
DF (dirección): Controla la selección de incremento o decremento de los registros SI y DI en las operaciones con cadenas de caracteres (1=decremento automático; 0=incremento). La bandera DF se controla con las instrucciones STD y CLD.
-
IF (interrupción): Controla el disparo de las interrupciones (1=habilita las interrupciones; 0=deshabilita las interrupciones). La interrupción no enmascarable es la única que no puede ser bloqueada por esta bandera. El estado de la bandera IF se controla con las instrucciones STI y CLI.
-
TF (trampa): Permite la operación del procesador en modo de depuración (paso a paso)
-
SF (signo): Contiene el signo resultante de una operación aritmética (0=positivo; 1=negativo).
-
ZF (cero): Indica el resultado de una operación aritmética o de comparación (0=resultado diferente de cero; 1=resultado igual a cero).
-
AF (acarreo auxiliar): Contiene el acarreo del bit 3. Esta bandera se prueba con las instrucciones DAA y DAS para ajustar el valor de AL después de una suma o resta BCD.
-
PF (paridad): Indica si el número de bits 1, del byte menos significativos de una operación, es par (0=número de bits 1 es impar; 1=número de bits 1 es par).
-
CF (acarreo): Contiene el acarreo del bit de mayor orden después de una operación aritmética; también almacena el contenido del último bit en una operación de desplazamiento o de rotación.
La arquitectura de estos ordenadores obliga a que la memoria sea dividida en bloques o segmentos de 64KB de longitud.
Para acceder a un dato se utilizan 2 registros (uno indica donde empieza el segmento y otro indica el desplazamiento con respecto a dicho comienzo)
2. ELEMENTOS DE UN PROGRAMA ENSAMBLADOR
En un programa ensamblador nos podemos encontrar con 2 tipos de sentencias: Las instrucciones y las directivas (o pseudo-operaciones o pseudo-ops)
Las instrucciones se aplican en tiempo de ejecución, y las directivas en tiempo de ensamblador de programa (que hacer con las instrucciones y los datos)
2.1 Instrucciones
El formato de una instrucción:
{etiqueta} VERBO-INSTRUCCIÓN {operandos} {comentario} // no es obligatorio lo que está entre llaves.
Ej: TRASPASO: MOV AX,300; // aquí iría un comentario sobre la instrucción
2.1.1 El campo etiqueta
Corresponde al nombre simbólico de la primera posición de las que ocupa la instrucción, y se utiliza para poder romper la secuencia del programa. Puede tener hasta 31 caracteres de longitud.
-
El primer carácter no puede ser un dígito.
-
Si se usa el carácter “.” Deberá estar el primero.
-
No se pueden utilizar los nombres reservados a otros elementos, como por ejemplo, AX,AH,AL,BX,MOV,ADD..
2.1.2 El campo verbo de la instrucción
Tiene una longitud de 2-6 caracteres y representa la acción que ejecutará la instrucción.
2.1.3 El campo comentario
Se pueden incluir comentarios, que simplificarán la comprensión del programa. El comentario deberá ir precedido por “;”
2.1.4 El campo operando
Indica los datos con los cuales se va a operar. Existen instrucciones de dos, uno o ningún operando, pero en el caso de haber 2, al primero se le denomina destino y al segundo fuente; en este caso, deberán ir separados por una coma.
Ej: MOX AX,BX Una instrucción con 2 operandos.
Ej: PUSH AX Una instrucción con un operando.
Los operandos pueden ser (registros, direcciones de memoria o valores inmediatos(constantes). La forma de referenciarlos se denomina modo de direccionamiento.
2.1.4.1 Modos de direccionamiento
La mayoría de las operaciones, se realizan entre registros o registros y memoria. Existen varias formas de referenciar los datos:
2.2 Directivas
El formato de una directiva es:
{nombre} VERBO-DIRECTIVA {operandos} {comentario} // las llaves son opcionales
Ejemplo:
CR EQU 13; retorno de carro. asignará el nombre CR al valor 13.
2.3 Constantes
Pueden llevar como operandos valores constantes, podrán ser de 5 tipos distintos (binarias, decimales, hexadecimales, octales y de tipo carácter)
Ejemplo:
32=00100000b=20h=40q -32= 1110000b=0E0h=340q
2.4 Operadores
Son modificadores que se utilizan en el campo de operandos y que pueden combinarse entre sí. Existen 5 clases de operadores en ensamblador.
2.4.1 Operadores aritméticos
+, –, *, /, MOD (resto de la división), 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
2.4.2 Operadores lógicos
Operadores lógicos AND, OR, XOR, NOT
2.4.3 Operadores relacionales
Comparan 2 valores numéricos o dos direcciones de memoria del mismo segmento y producen “0” si la relación es falsa, o “0FFFFh” si la relación es verdadera.
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.
2.4.4 Operadores de retorno de valores o analíticos
Son operadores pasivos, que se encargan de suministrar información sobre las variables y las etiquetas del programa.
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).
LENGTH 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.
2.4.5 Operadores de atributos
Estos operadores permiten redefinir los atributos de las variables (BYTE,WORD,DWORD,TWORD) y las etiquetas (NEAR, FAR)
* Operador PTR: redefine el atributo de tipo (BYTE, WORD, DWORD, QWORD, TBYTE) o el
de distancia (NEAR o FAR) de un operando de memoria. Por ejemplo, si se tiene una tabla definida de la siguiente manera:
tabla DW 10 DUP (0) ; 10 palabras a 0
* Operadores HIGH y LOW: devuelven la parte alta o baja, respectivamente (8 bits) de la expresión:
dato EQU 1025
MOV AL,LOW dato ; AL = 1
MOV AH,HIGH dato ; AH = 4
Con el operando DUP pueden definirse estructuras repetitivas. Por ejemplo, para asignar 100 bytes a cero y 25 palabras de contenido indefinido (no importa lo que el ensamblador asigne):
ceros DB 100 DUP (0)
basura DW 25 DUP (?)
3. CLASIFIACIÓN DE LAS DIRECTIVAS
3.1 Directivas de control del ensamblador
ORG expresión: El offset del código o datos a continuación será la indicada por la expresión. Todos los símbolos que forman la expresión deben conocerse en el primer paso de ensamblado.
EVEN: Hace que la próxima instrucción o dato se ensamble en la siguiente posición par.
END [etiqueta]: Debe ser la última sentencia del código fuente. La etiqueta indica dónde debe comenzar la ejecución del programa. Si el programa se compone de varios módulos, sólo el módulo que contiene la dirección de arranque del programa debe contener la directiva END etiqueta. Los demás módulos deberán terminar con la directiva END (sin etiqueta).
3.2 Directivas para la definición de símbolos
nombre EQU expresión
nuevo_nombre EQU viejo_nombre
Una vez definido un nombre mediante EQU, no se puede volver a definir.
=: Es similar a EQU pero permite que el símbolo se pueda redefinir. Sólo admite la forma: nombre = expresión.
3.3 Directivas para la definición de segmentos
SEGMENT…ENDS
nombre_segm
SEGMENT [alineación][combinación][‘clase’]
sentencias
nombre_segm
ENDS
Alineación: define el rango de direcciones de memoria para el cual puede elegirse el inicio del segmento. Hay cinco posibles:
-
BYTE: El segmento comienza en el siguiente byte.
-
WORD: El segmento comienza en la siguiente dirección par.
-
DWORD: Comienza en la siguiente dirección múltiplo de 4.
-
PARA: Comienza en la siguiente dirección múltiplo de 16.
-
PAGE: Comienza en la siguiente dirección múltiplo de 256.
ASSUME: Sirve para indicar al ensamblador qué registro de segmento corresponde con un segmento determinado. Cuando el ensamblador necesita referenciar una dirección debe saber en qué registro de segmento lo apunta.
Sintaxis: ASSUME reg_segm:nombre [, reg_segm:nombre…]
donde el nombre puede ser de segmento o de grupo, una expresión utilizando el operador SEG o la palabra NOTHING, que cancela la selección de registro de segmento hecha con un ASSUME anterior.
3.4 Directivas para la definición de datos
Ubica memoria para un ítem de datos y opcionalmente asocia un nombre simbólico con esa dirección de memoria y/o genera el valor inicial para ese ítem.
-[nombre] DB valor_inicial [, valor_inicial…]
donde valor_inicial puede ser una cadena o una expresión numérica cuyo resultado esté entre -255 y 255.
-[nombre] DW valor_inicial [, valor_inicial…]
donde valor_inicial puede ser una expresión numérica cuyo resultado esté entre -65535 y 65535 o un operando de memoria en cuyo caso se almacenará el offset del mismo.
-[nombre] DD valor_inicial [, valor_inicial…]
donde valor_inicial puede ser una constante cuyo valor esté entre -4294967295 y 4294967295, una expresión numérica cuyo valor absoluto no supere 65535, o bien un operando de memoria en cuyo caso se almacenarán el offset y el segmento del mismo (en ese orden).
Si se desea que no haya valor inicial, deberá utilizarse el símbolo ?
-DF (definir palabra larga)
[nombre_variable] DF [valor inicial] Reserva memoria para una variable tipo palabra larga ( 6 bytes) El valor inicial será igual que en el anterior, aunque no se utiliza para almacenar direcciones.
-DQ (definir cuádruple palabra)
-[nombre] DQ valor_inicial [, valor_inicial…] Reserva memoria para una variable tipo cuádruple palabra. El valor inicial será igual que el anterior, pero no se utiliza para almacenar direcciones.
-DT (definir 10 bytes)
-[nombre] DT valor_inicial [, valor_inicial…] Reserva memoria para una variable de diez bytes. Estas variables se suelen utilizar para almacenar dígitos decimales empaquetados.
-RECORD (Definir registro)
-[nombre_registro] RECORD campo1: numero_bytes1, campo2: numero_bytes2…
Define un registro con 4 campos, A de cuatro bits, B de seis, C de cuatro y D de 2.
3.5 Directivas para la definición de procedimientos
Los procedimientos son secciones de código que se pueden llamar para su ejecución desde distintas partes del programa.
etiqueta
PROC
{NEAR|FAR}
sentencias
etiqueta
ENDP
4. CLASIFICACIÓN DE LAS INSTRUCCIONES
4.1 Instrucciones de transferencia de datos(no afectan flags)
Sirven para mover información dentro del programa, ya sean datos o direcciones.
4.1.1 De propósito general
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}
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
4.1.1.1 Para el manejo de la pila
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}.
PUSHF
Almacena los flags en la pila.
Operación: SP <- SP – 2, [SP+1:SP] <- Flags.
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}.
POPF
Pone en los flags el valor que hay en la pila.
Operación: Flags <- [SP+1:SP], SP <- SP + 2
4.1.2 De transferencia de direcciones
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]
4.2 De entrada/salida
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.
4.3 De cálculo
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.
4.4 Lógicas
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.
NEG dest
Operación: dest <- – dest.
donde dest = {reg|mem} y src = {reg|mem|inmed} no pudiendo ambos operandos estar en memoria.
4.5 De desplazamiento
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.
4.6 De rotación
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.
4.7 De ruptura de secuencia
También llamadas de transferencia de control, se utilizan para romper la secuencia de ejecución del programa. No afecta a las banderas.
4.7.1 Incondicional
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.
4.7.2 Condiconal
Estas instrucciones transfieren el control del programa a otro punto de éste si se cumple una determinada condición; en el caso de no cumplirse, se ejecuta la instrucción siguiente a ellas. Se utilizan junto con la instrucción 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).
4.7.3 Iterativas
Permiten la ejecución de bucles dentro del programa. El número de repeticiones viene determinado pro el contenido del registro CX(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.
4.8 Otras instrucciones
XCHG reg,{reg|mem}
Intercambia ambos valores
4.8.1 Llamada vuelta de interrupción
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.
4.8.2 Operaciones con cadenas de caracteres
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
4.8.3 Operadores con banderas
Se utilizan para poder manejar los bits del registro de bandera. No llevan operandos y no afectan a las demás banderas.
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.