Tema 33 – Programación en lenguaje ensamblador.

Tema 33 – Programación en lenguaje ensamblador.

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

2.1 Instrucciones 6

2.2 Directivas 7

2.3 Constantes 7

2.4 Operadores 7

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.2 De entrada/salida 12

4.3 De cálculo 12

4.4 Lógicas 14

4.5 De desplazamiento 14

4.6 De rotación 14

4.7 De ruptura de secuencia 15

4.8 Otras instrucciones 17

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.

    1. Registros internos del microprocesador (80*86 de Intel)

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.

    1. La memoria del ordenador. Direccionamiento.

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:

  1. BYTE: El segmento comienza en el siguiente byte.

  2. WORD: El segmento comienza en la siguiente dirección par.

  3. DWORD: Comienza en la siguiente dirección múltiplo de 4.

  4. PARA: Comienza en la siguiente dirección múltiplo de 16.

  5. 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:

  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}

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:

  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

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.