Sunteți pe pagina 1din 16

Listado de Instrucciones del iAPX 8086.

Nota: En las instruciones de doble operando el destino es el primer operando (el de la izauierda) en la instrucción.

- AAA (Ajuste ASCII para la suma).


Realiza una corrección del resultado (en AL) de la suma de 2 operandos decimales no empaquetados
(Unpacked), dando como resultado una suma decimal desempaquetada.

Si ((AL) & OFH) > 9 or (AF) = 1 entonces:.


(AL)--- (AL) + 6
(AH)--- (AH) + 1
(AF)--- 1
(CF)--- (AF)
(AL)--- (AL) & OFH

Ejemplo: AAA ;después de la adición


Banderas afectadas : AF, CF
Banderas no definidas : OF, PF, SF, ZF

- AAD (Ajuste ASCII para la división).


Realiza un ajuste del dividendo en AL antes que una instrucción subsiguiente divida 2 operandos
decimales desempaquetados. El byte más significativo (AH) del acumulador se multiplica por 10 y se le
suma al menos significativo (AL). El resultado se guarda en AL. AH se pone en 0.

Ejemplo: AAD ;antes de la división


Banderas afectadas: PF, SF, ZF
Banderas no definidas: AF, CF, OF

- AAM (Ajuste ASCII para la multiplicación).


Realiza una corrección en el resultado en AL de multiplicar 2 operandos decimales unpacked dando como
resultado un producto decimal desempaquetado. El cociente de AL/10 lo deja en AH y el resto queda en AL.

Ejemplo: AAM ;después de la multiplicación


Banderas afectadas: PF, SF, ZF
Banderas no definidas: AF, CF, OF

- AAS (Ajuste ASCII para la resta).


Idéntico a AAA pero para la resta.

Si ((AL) & 0FH) > 9 or (AF) = 1 entonces:


(AL)---(AL)-6
(AH)---(AH)-1
(AF)---1
(CF)---(AF)
(AL)---(AL)&0FH

Ejemplo: AAS ; después de una sustracción


Banderas afectadas: AF, CF
Banderas no definidas: OF, PF, SF, ZF

- ADC (Suma con acarreo).


Suma el operando destino con el origen más la bandera CF, deja el resultado en el destino.

Ejemplos: ADC AX,SI


ADC CH,BL

4-1
ADC DX,MEM_WORD
ADC BETA[DI],BX
ADC AL,3
ADC AL,BYTE PTR [DI]
ADC SI,333

Banderas afectadas: AF, CF, OF, PF, SF, ZF

- ADD (Suma).
Suma el operando destino con el origen y deja el resultado en el destino.

Ejemplos: (análogos a ADC)


Banderas afectadas: AF, CF, OF, PF, SF, ZF

- SUB (Resta).
Resta el operando destino con el origen y deja el resultado en el destino.

Ejemplos: (análogos a ADC)


Banderas afectadas: AF, CF, OF, PF, SF, ZF

- AND (And Lógico).


Se realiza una operación AND lógica entre los 2 operandos, el resultado se almacena en el destino. Las
banderas de CF y OF se ponen en "0".

Ejemplos: (análogos a ADC)


Banderas afectadas: CF, OF, PF, SF, ZF
Banderas no definidas: AF

- CALL (llamar a una subrutina).


1.- Si es Inter-segmento entonces:
(SP) ---(SP)-2
((SP) + 1: (SP)) ---(CS)
(CS) ---SEG
2.- (SP) <--- (SP) - 2
3.-((SP)+1:(SP)) <-- (IP)
4.- (IP) <--- DEST

El valor DEST se extrae de dos byte que siguen al código de la instrucción si es directo el CALL y si es
indirecto se extraen de una palabra de 16 bits almacenada en un registro o en una localización de memoria.
El valor SEG se extrae de los dos byte que siguen a DEST en el código de la instrucción, si es directo el
CALL y, si es indirecto se toman de los dos bytes siguientes a los del DEST en memoria (en este caso se
sacan de memoria solamente).

Ejemplos:
CALL ETIQUETANEAR ;Directo Intra-segmento
CALL SUBRUTINAFAR ;Directo Inter-segmento
CALL WORD PTR TABLA [SI] ;Indirecto intra-segmento
CALL DWORD PTR [BX] ;Indirecto inter-segmento
CALL AX ;Indirecto intra-segmento
CALL MEM_DOUBLE_WORD ;Indirecto inter-segmento

Banderas Afectadas: Ninguna.

- CBW (Convierte byte en palabra).


Si el byte menos significativo del Acumulador (AL) es menor que 80H, AH se hace 0. De otra forma AH se
pone en FFH. Hace una extensión del signo de AL hacia AH.
4-2
Banderas afectadas: Ninguna

- CLC (Limpia CF)


(CF) <--- 0
Banderas afectadas: CF

- CLD (Limpia DF).


(DF) <--- 0
Banderas afectadas: DF

- CLI (Limpia IF)


(IF) <--- 0 Deshabilita la interrupción que se solicita por INTR.
Banderas Afectadas: IF

- CMC (Complementa CF).


CF <--- CF
Banderas afectadas: CF

- CMP (Compara dos operandos).


El operando fuente es substraído del operando destino. Las banderas son alteradas pero los operandos
no se afectan.

Ejemplos: CMP AX,DX


CMP BH,CL
CMP MEM_BYTE,CH
CMP ALPHA[DI],DX
CMP DI,MEM_WORD
CMP BX,999
CMP BH,7
CMP MEM_WORD,765H

Banderas afectadas: AF, CF, OF, PF, SF, ZF

- CMPS (Compara byte o word en cadenas)


El operando de la derecha, usando DI como índice en el segmento extra, es substraído del operando de la
izquierda, el cual usa SI como índice. SI y DI se decrementan si DF=1 o se incrementan si DF=0,
apuntando al próximo elemento de las cadenas que se comparan. El incremento o decremento es 1 para
cadenas de byte y 2 para palabras. Esta instrucción puede ser repetida y con ella buscar un byte o word en
una cadena.

Ejemplos:
MOV SI,OFFSET STRING 1
MOV DI,OFFSET STRING 2
CMPSB ; Para STRING 1,STRING 2 bytes.
CMPSW ; Para STRING 1,STRING 2.

Banderas afectadas: AF, CF, OF, PF, SF, ZF

- CWD (Convierte palabra en doble palabra).


Se extiende el bit más significativo de AX sobre DX.

Si (AX) < 8000H entonces (DX) <--- 0


sino (DX) <--- FFFFH
Banderas afectadas: Ninguna

4-3
- DAA (Ajuste decimal para la suma).
Realiza una corrección del resultado (en AL) de sumar 2 operandos decimales empaquetados
(packed), dando como resultado una suma decimal empaquetada (packed).

Si ((AL) & 0FH) > 9 or (AF) = 1 entonces:


(AL)<-- (AL) + 6
(AF)<-- 1
Si (AL) > 9FH or (CF) = 1 entonces:
(AL)<-- (AL) + 60H
(CF)<-- 1

Banderas afectadas: AF, CF, PF, SF, ZF


Banderas no definida: OF

- DAS (Ajuste decimal para la resta).


Realiza una corrección del resultado (en AL) de restar 2 operandos decimales empaquetados (packed),
dando como resultado una diferencia decimal empaquetada (packed).

Si ((AL) & 0FH) > 9 or (AF) = 1 entonces:


(AL) <--- (AL) - 6
(AF) <--- 1
Si (AL) > 9FH or (CF) = 1 entonces:
(AL) <--- (AL) - 60H
(CF) <--- 1

Banderas afectadas: AF, CF, PF, SF, ZF


Banderas no definida: OF

- DEC (Decrementa destino).


El operando especificado se reduce en 1.

Ejemplos: DEC BYTE PTR [BX]


DEC SI
DEC BL

Banderas afectadas: AF, OF, PF,SF, ZF

- DIV (División sin signo).


Realiza una división sin signo del operando de longitud doble (NUMR) contenido en el acumulador y su
extensión (AL y AH para operación con 8 bit y AX y DX para operación con 16 bits) entre el operando
DIVR contenido en el operando fuente especificado. Da como resultado un cociente (operando COC) en
el acumulador (AL o AX), y un resto (operando RESTO) en la extensión del acumulador (AH para
operación con 8 bits y DX para 16 bits). Si el cociente es mayor que MAX (como cuando se intenta hacer
división por cero), entonces COC y RESTO estarán indefinidos y se genera una IT del tipo 0. Las banderas
no están definidas en ninguna operación DIV.

(temp) <-- NUMR


Si (temp)/(DIVR) > MAX entonces:
(COC),(REM) no definidos
(SP) <-- (SP) - 2
((SP) + 1:(SP)) <-- FLAGS
(IF) <-- 0
(TF) <-- 0
(SP) <-- (SP) - 2
((SP) + 1:(SP)) <-- (CS)
(CS) <-- (2) [el contenido de las loc. 2 y 3
4-4
(SP) <-- (SP) - 2
((SP) + 1:(SP)) <-- IP
(IP) <-- 0 [el contenido de las loc. 0 y 1
sino
(COC) <-- (temp)/(DIVR) ;donde "/" es div
;sin signo.
(RESTO) <-- (temp)%(DIVR) ;donde "%" es mod

(a) Si BYTE: NUMR = AX, DIVR = EA, COC = AL,


RESTO = AH, MAX = FFH
(b) Si WORD: NUMR = DX : AX, DIVR = EA, COC = AX, REST0= DX,
MAX = FFFFH

Ejemplos:
1.- Para dividir una palabra por un byte.
MOV AX, NUMERATOR_WORD
DIV DIVISOR_BYTE ;Cociente en AL, resto en AH.

2.- Para dividir en byte por un byte.


MOV AL, NUMERATOR_BYTE
CBW ;Convierte byte AL a palabra en AX
DIV DIVISOR_BYTE ;Cociente en AL, resto en AH

3.- Para dividir una palabra doble entre una palabra


M0V DX, NUMERATOR_HI_WORD
MOV AX, NUMERATOR_LO_WORD
DIV DIVISOR_WORD ;Cociente en AX, resto en DX

4.- Para dividir una palabra por otra palabra.


MOV AX, NUMERATOR_WORD
CWD ;Convertir palabra a doble palabra
DIV DIVISION_WORD ;Cociente en AX, resto en DX

Banderas afectadas: ninguna valida


Banderas no definidas: AF, CF, OF, PF, SF, ZF

- ESC (Escape: instrucciones del coprocesador matemático).


La instrucción ESC brinda un mecanismo mediante el cual el 8087 puede recibir sus instrucciones a
través del 8086 y usar los modos de direccionamiento del 8086. El 8086 no realiza ninguna otra operación
con
la instrucción ESC, simplemente accesa un operando en memoria y lo coloca en el bus.

Banderas afectadas: ninguna


- HLT (alto).
Hace que el procesador 8086 vaya al estado de alto. Para salir del estado de alto tiene que recibirse una
interrupción externa o activarse RESET.

Banderas afectadas: Ninguna

- IDIV (División entera con signo).


Como DIV para tomando en cuenta el signo.

(temp) <-- (NUMR)


Si (temp)/(DIVR) > 0 and (temp)/(DIVR) > MAX
ó (temp)/(DIRV) < 0 and (temp)/(DIVR) < 0 - MAX - 1
entonces:
4-5
(COC), (RESTO) no definido
(SP) <-- (SP) -2
((SP) + 1: (SP)) <-- FLAGS
(IF) <-- 0
(TF) <-- 0
(SP) <-- (SP)-2
((SP)+1:(SP)) <-- (CS)
(CS) <-- 2
(SP) <-- (SP)-2
((SP)+1(SP)) <-- (IP)
(IP) <-- 0
sino
(COC) <-- (temp)/(DIVR); donde / es división con signo
(RESTO) <-- (temp)%(DIVR); donde % es modulo con signo

(a) Si BYTE : NUMR = AX, DIVR = EA, COC = AL, RESTO = AH,
MAX = 7FH
(b) Si WORD: NUMR = DX:AX, DIVR = EA, COC = AX, RESTO = DX,
MAX = 7FFFH

Ejemplos:

1.- MOV AX,NUMERATOR_WORD [BX]


IDIV DIVISOR_BYTE [BX]

2.- MOV DX,NUM_HI_WORD


MOV AX,NUM_LO_WORD
IDIV DIVISOR_WORD [SI]

Banderas afectadas: AF, CF, OF, PF, SF, ZF

- IMUL (Multiplicación entera con signo).


Se multiplica el acumulador (AL para byte y AX para palabra), por el operando especificado. Si la mitad
más significativa del resultado es la extensión del signo de la otra mitad, se pone CF y OF en "0" sino se
ponen en "1".

Ejemplos:
1.- MOV AL,OPERANDOBYTE
IMUL BL ;Resultado en AX

2.- MOV AX,OPERANDOWORD


IMUL RSRC_WORD ;Resultado en DX:AX

3.- Para multiplicar un byte por una palabra


MOV AL,MUL_BYTE
CBW
IMUL OPERANDOWORD

Banderas Afectadas: CF, OF


Banderas no definidas: AF, PF, SF, ZF

- IN (Leer de Puerto).
El contenido del acumulador se reemplaza por el contenido del puerto seleccionado, AL si es de byte y AX
si es de palabra.

Ejemplos: IN AX,DIR-WORD-PORT ;entrada de palabra a AX


4-6
IN AL,DIR-BYTE-PORT ;entrada de byte a AL
IN AL,60H

Si se desea variar fácilmente la dirección del puerto o la dirección no cabe en un byte, en este caso la
dirección viene en el registro DX.

Ejemplo: IN AX,DX ;entrada de una palabra a AX


IN AL,DX ;entrada de un byte a AL

Banderas Afectadas: Ninguna

- INC (incrementa en 1 el destino).


El operando especificado se incrementa en 1. No hay acarreo después del bit más significativo.

Ejemplos: INC CL
INC DI
INC BYTE PTR [BX]
INC MEM-WORD [BX]
INC WORD PTR[BX]

Banderas afectadas: AF, OF, PF, SF, ZF

- INT (Interrupción o trampa).


Se guardan en el STACK las Bandera, CS e IP relativos a la dirección siguiente a la instrucción INT TIPO, y
se carga IP y CS con el los valores almacenados en la Tabla de Vectores de Interrupción asociados al TIPO
especificado en la instrucción.

(SP) <--- (SP)-2


((SP+1):(SP)) <--- BANDERAS
(IF) <-- 0
(TF) <-- 0
(SP) <-- (SP)-2
((SP)+1:(SP)) <--- (CS)
(CS) <--- (TYPE*4+2)
(SP) <--- (SP)-2
((SP)+1:(SP)) <--- (IP)
(IP) <--- (TIPO*4)

Ejemplos: INT 3 ;instrucción de un byte.


INT 2 ;2 bytes
INT 67 ;2 bytes

Banderas afectadas: IF, TF

- INTO (Interrupción si OF = 1)
Operación:

Si (OF)=1 entonces:
(SP) <-- (SP)-2
((SP)+1:(SP)) <--- FLAGS
(IF) <--- 0
(TF) <--- 0
(SP) <--- (SP)-2
((SP)+1:(SP)) <--- (CS)
(CS) <--- (12H)
(SP) <--- (SP)-2
4-7
((SP)+1:(SP)) <--- (IP)
(IP) <--- (10H)

- IRET (Retorno de Interrupción)


Se cargar IP, CS y Banderas desde el STACK sacando e incrementando el puntero del STACK.

(IP) <--- ((SP)+1:(SP))


(SP) <--- (SP) + 2
(CS) <--- ((SP)+1:(SP))
(SP) <--- (SP) + 2
FLAGS <--- ((SP)+1:(SP))
(SP) <--- (SP) + 2

Banderas Afectadas: Todas

- Saltos Condicionales.
Operación:
Si se cumple la condición especificada, se le suma al IP la distancia desde el final de la
instrucción hasta la etiqueta destino. En caso contrario no se opera.

Ejemplo: JZ ETIQUETA

Banderas afectadas: Ninguna

Nota: La etiqueta de destino debe estar en el rango de -128 a +127 bytes de la instrucción
de salto condicional [Vea tabla de saltos Condicionales].

- JMP (salto Incondicional).

El IP es reemplazado por el offset del destino en los saltos intersegmentos y en los intrasegmentos
indirecto. Cuando el salto es directo intrasegmento, la distancia desde el fin de la instrucción hasta la
etiqueta de destino, es añadida a IP. Los saltos intersegmentos primero reemplazan CS usando la segunda
palabra después de la instrucción (directo), o usando la segunda palabra que sigue a la dirección indicada
(indirecto).
Intra segmento directo (largo):

Ejemplo: JMP ETIQ_NEAR

(IP) <--- (IP) + desp signo extendido a 16 bits

Intra segmento directo (corto):


Ejemplo: JMP TARGET_LABEL
JMP SHORT NEAR_LABEL

Nota: El destino debe estar dentro de un rango de -128 a +127 bytes de esta instrucción.
El Desp es el offset destino explicado en la instrucción.

Intersegmento directo:
Ejemplos: JMP ETIQ_DECLARED_FAR
JMP FAR PTR ETIQ
JMP FAR PTR ETIQ_NEAR

Intersegmento Indirecto:
CS <--- (MEM + 2)
IP <--- (MEM)

4-8
Ejemplos: JMP VAR_DOUBLEWORD
JMP DWORD PTR [DI]

Intra Segmento Indirecto:


(IP) <--- (MEM16) o REG16

Ejemplos: JMP TABLE [BX]


JMP WORD PTR [BX+DI]
JMP BETA_WORD
JMP AX
JMP SI
JMP BP

Banderas afectadas: Ninguna

- LAHF (Cargar AH las bandera).


Se cargan las siguientes banderas en AH:

(AH) <--- (SF):(ZF):X:(AF):X:(PF):X:(CF)


7 6 5 4 3 2 1 0
Banderas afectadas: Ninguna

- LDS (Cargar puntero en DS:REG).


El contenido del registro especificado es reemplazado por la primera palabra del operando de memoria de
doble palabra.

(REG) <--- (MEM)


El contenido del registro DS es reemplazado por la segunda palabra del operando.

(DS) <--- (MEM+2)

Ejemplos: LDS BX,TABLA_DIREC [SI]


LDS SI,NEWSEG [BX]

Banderas afectadas: Ninguna

- LEA (Carga la dirección efectiva).


El contenido del registro especificado es reemplazado por el offset de la variable indicada ó etiqueta ó
expresión de dirección.

Ejemplo: LEA BX, VARIABLE_7


LEA DX, BETA [BX][SI]
LEA AX, [BP][DI]

Banderas afectadas: Ninguna

- LES (Cargar puntero en ES:REG).


(Análoga a LDS cambiando DS por ES)

Ejemplos: LES BX, TABLA_DIREC [SI]


LES DI, NEWSEG [BX]

Banderas afectadas: Ninguna

- LOCK

4-9
Activa la señal *LOCK en modo máximo durante los ciclos de máquina de la instrucción que le sigue.
En sistemas con multiprocesadores con recursos compartidos es necesario tener mecanismos que
controlen el acceso a dichos recursos. Tales mecanismos, aunque generalmente se logran mediante los
sistemas operativos, necesitan una base circuital. Un mecanismo suficiente para lograr esto es el locked
exchange (conocido también como "test and set lock"). Se asume que un circuito externo, al recibir esta
señal, prohiba el acceso al bus de otros posible amos del bus durante el período en el cual se mantenga
activo.

Banderas afectadas: Ninguna

Ejemplo:
Chequea: MOV AL,1 ;Poner AL a 1 (implica locked)
LOCK XCHG Sema,AL ;test and set lock
TEST AL,AL ;Chequear si estaba activo el semáforo y si es así se
JNZ Chequea ;chequeando si el recurso esta libre
;Programa a ejecutar que usa el recurso.
MOV Sema,0 ;Semáforo=0 avisando fin del uso del recurso.

- LODSB/LODSW (Carga byte o palabra)


El byte (o palabra) fuente se carga en el AL (o AX). El índice fuente se decrementa en 1
para bytes (o 2 para palabras) si la bandera DF = 1 sino se incrementa.

Ejemplos:
CLD ;DF = 0
MOV SI,OFFSET BYTE_STRING
LODSB

Banderas afectadas: Ninguna

- LOOP (Repetición de un lazo).


El registro contador de repeticiones (CX) se decrementa en 1 y si CX es desigual de 0, se suma la distancia
desde el final de esta instrucción a la etiqueta indicada con el IP, efectuando se un salto con el objetivo de
repetir el lazo. si CX = 0 no se ejecuta el salto y se hace la instrucción siguiente.

Ejemplo: La secuencia sgte. calculara la suma de chequeo de 6 bits de un arreglo no nulo.

MOV CX,LENGHT ARRAY


MOV AX,0
MOV SI,AX
NEXT: ADD AX,ARRAY[SI]
ADD SI,TYPE ARRAY
LOOP NEXT

Banderas afectadas: Ninguna

Nota: La etiqueta destino debe estar dentro del rango de -128 a +127 bytes de la
instrucción LOOP.

- LOOPZ o LOOPE (Repite el lazo mientras que sea igual o cero)


El contador (CX) se decrementa en 1 (idem al LOOP) Además no ocurre salto si (ZF) = 0 ó si (CX) = 0.

Ejemplo: La siguiente secuencia encuentra la primera elemento distinto de cero en un


arreglo de bytes.

MOV CX,LENGTH ARRAY


MOV SI,-1
4-10
NEXT: INC SI
CMP ARRAY [SI],0
LOOPE NEXT
JNE NOIGUAL
. ;llega aquí si todo el arreglo=0
.
.
NOIGUAL: ;SI dice cual entrada es desigual a 0

Banderas afectadas: Ninguna

Nota: La etiqueta destino debe estar entre -128 to +127 bytes.

- LOOPNZ o LOOPNE (salta mientras que no sea cero o igual)

Se decrementa CX en 1. Si el nuevo CX es desigual a 0 y la bandera ZF = 0, se le suma la


distancia desde la instrucción a la etiqueta al IP, realizando un salto. No ocurre salto si
(CX)=0 ó (ZF)=1.

Banderas afectadas: Ninguna


Nota: La etiqueta destino debe estar a -128 to +127 bytes.

- MOV (Mover el valor de la fuente al destino).


Movimientos entre operandos como se indica a continuación,

Registro <--> registro.


Memoria <--> registro.
Reg.Seg <--> registro.
Reg.Seg <--> memoria.
Registro - Inmediato.
Memoria - Inmediato.

Ejemplos: MOV ALPHA_MEM,AX


MOV DS,AX
MOV ES,SS:NEW_WORD[DI]
MOV BX, ES
MOV CL, DH
MOV DX, ARRAY[SI]
MOV AX, 77
MOV CL,18
MOV BYTE PTR [DI], 66

Banderas afectadas: Ninguna.

- MOVS (Mueve fuente a destino en cadenas).


La cadena fuente cuyo offset esta en el SI se mueve hacia la localización en el segmento extra cuyo offset esta
en DI. Después se incrementan tanto SI como DI si la bandera DF = 0, o se decrementan si DF = 1. El
incremento o decremento es 1 para cadenas de byte y 2 para cadenas de palabras.

Ejemplo: LEA SI, SOURCE


LEA DI, DEST
MOV CX, LENGTH SOURCE
CLD
REP MOVSB

- MUL (Multiplicación sin signo del acumulador y otro operando).


4-11
Igual que IMUL pero sin signo.

Banderas Afectadas: CF, OF


Bandera no definidas: AF, PF, SF, ZF

- NEG (Convertir el operando en su negativo módulo 2).


El operando especificado se sustrae de 0FFH para bytes y 0FFFFH para palabras y se le suma 1. El resultado
se guarda en el operando.

Banderas afectadas: AF, CF, OF, PF, SF, ZF

- NOP (No operación)


Hace que la computadora no opere durante 3 periodos de reloj. Luego sigue la próxima instrucción en
secuencia.

Banderas afectadas: Ninguna

- NOT (Convierte el operando en su complemento a 1).


El operando específico se resta de OFFH para byte o OFFFFH para palabra, y el resultado se almacena en el
operando.

Banderas afectadas: Ninguna

- OR (OR lógico).

Se efectúa una operación OR-logica bit a bit entre los dos operandos. El resultado queda en el destino. CF y
OF toman 0.

Ejemplos: OR BL,DH
OR AX, 8000H
OR CL, 37
OR MEM_byte,DH

Banderas afectadas: CF, OF, PF, SF, ZF


Banderas no definidas: AF

- OUT (Escribir byte o palabra en un puerto).


El contenido del puerto designado es reemplazado por el contenido del acumulador. La dirección del puerto
tiene las mismas restricciones que la instrucción IN.

Ejemplos: OUT 60H,AL


OUT DX,AX

Banderas afectadas: Ninguna

- POP (Saca del stack hacia el destino).

El contenido del operando destino es reemplazado por la palabra en el tope de la pila.

(DEST) <--- ((SP)+1:(SP))


(SP) <--- (SP)+2

Banderas afectadas: Ninguna

Ejemplos: POP CX POP [DI]


4-12
POP DX POP VAR_WORD
POP DS

- POPF (Saca una palabra del stack hacia las banderas).


Flags <--- ((SP)+1:(SP))
(SP) <--- (SP)-2

Las banderas se sustituyen por los valores de la palabra en el tope de la pila de la


siguiente forma:

OF -- bit 11 ZF -- bit 6
DF -- bit 10 AF -- bit 4
IF -- bit 9 PF -- bit 2
TF -- bit 8 CF -- bit 0
SF -- bit 7

y después se incrementa el puntero del stack.

- PUSH (Deposita el operando en el stack).


Se decrementa el SP en 2. El contenido del operando especificado se almacena en el tope de la pila.

Banderas afectadas: Ninguna

Ejemplos: PUSH AX
PUSH SS
PUSH CS es legal
PUSH BETA
PUSH BETA [BX+DI]

- PUSHF (Pone las banderas en el stack).


El puntero del stack se decrementa en 2 y las banderas se almacenan en los bits apropiados del tope de la pila
(vea POPF).

Banderas afectadas: Ninguna

- RCL (Rota a la izquierda a través del acarreo).


Rota a la izquierda a través de CF creando un registro circular con el operando y el CF. El operando puede
ser Registro o memoria nunca registro de segmento.

Ejemplos:
RCL AH, 1
RCL MEM_BYTE, 1

MOV CL, 3
RCL DH, CL ;rota 3 bits a la izquierda

Banderas afectadas: CF, OF

- RCR (Rota a la derecha a través del acarreo).


Análoga a RCL, cambiando el sentido de rotación.

Banderas afectadas: CF, OF

- REP (Repite la instrucción de cadena que sigue).


Si CX <> 0 se le da servicio a la interrupción si esta pendiente la solicitud, ejecuta la instrucción de
4-13
cadena. Luego se decrementa en 1 CX. Si la repetición es condicional y la instrucción de cadena es
CMPS o SCAS, se analiza la bandera Z para salir de las repeticiones o continuar con ellas.

Ejemplos:
REP MOVS
REPE CMPSB ;Repite mientras que sea igual y CX <> 0. Se sale del lazo antes
;que CX = 0 solo si el byte fuente y destino son iguales.

REPNZ SCASW ;Repite mientras se desigual y CX <> 0.

Nota: REPNZ (no cero) = REPNE (no igual)


REPZ (ZERO) = REPE (igual)
Banderas afectadas: Vea las op. de cadenas correspondiente

- RET (Retorno de subrutina).


(IP) <--- ((SP)+1:(SP))
(SP) <--- (SP)+2
Si intersegmento entonces:
(CS) <--- ((SP)+1:(SP))
(SP) <--- (SP)+2
Si es Ret K se le suma K al SP.

Ejemplos: RET 4, RETF, RETF 8, RET 12 y RET

- ROL (Rota a la izquierda solo el operando).


El operando destino rota a la izquierda. El bit más significativo del operando se copia también CF.

Ejemplos: ROL AH, 1


ROL SI, 1
ROL BYTE PTR ALPHA [DI],1

MOV CL,3
ROL DH,CL

Banderas afectadas: CF, OF.

- ROR (Rota a la derecha solo el operando).


Análoga al ROL pero rotando a la derecha. El bit menos significativo se copia también CF.
Banderas afectadas: CF,OF.

- SAHF (Carga AH en las banderas).

(SF):(ZF):X:(AF):X:(PF):X:(CF) <--- (AH)


Banderas afectadas : SF, ZF, AF, PF, CF

- SHL y SAL (Rotación aritmética a la izquierda).


Como RCL pero en este caso el en el bit menos significativo del operando se pone "0" siempre.

Banderas afectadas: CF, OF, PF, SF, ZF


Banderas no definidas: AF

- SAR (Rotación aritmética a la derecha).


El operando destino se desplaza a la derecha pero el bit más significativo se mantiene (mantiene el signo).
El bit menos significativo se pasa al CF.
4-14
Banderas afectadas: CF, OF, PF, SF, ZF
Banderas no definidas: AF

- SHR (Rotación lógica a la derecha).


Se rota el operando a la derecha entrando "0" al bit más significativo. El bit menos significativo pasa al CF.

Banderas afectadas: CF, OF, PF, SF, ZF


Banderas no definidas: AF

- SBB (Resta incluyendo el acarreo).


Ejemplo: Los mismos que con ADC.
Banderas afectadas: AF, CF, OF, PF, SF, ZF

- SCAS (Busca en una cadena).


SCAS/SCASB/SCASW

Se resta el AL (AX) menos el valor en (ES:DI) y se alteran solos las banderas. DI se incrementa o decrementa
en 1 (2) si la operación de byte (palabra). Si DF = 0 se incrementa.

Ejemplo: CLD ;Hace que DI se incremente.


MOV CX,LENGHT CADENA_DEST_Byte
MOV DI, OFFSET CADENA_DEST_BYTE
MOV AL, "M"
REPNE SCAS ;Finaliza si encuentra "M" o CX = 0.

Banderas afectadas: AF, CF, OF, PF, SF, ZF

- STC (Poner en 1 CF).


La bandera de acarreo se pone en 1.

- STD (Pone en 1 DF).


Se pone en 1 la bandera de dirección.

- STI (Habilita interrupción).


Pone en 1 a IF. Habilitando INT enmascarables.

- STOS (Almacena el Acumulador en memoria).


STOS/STOSB/STOSW

El byte (o palabra) en AL (o AX) se almacena en la loc. (ES:DI). DI se incrementa si DF es 0 sino se


decrementa. Los incrementos o decrementos serán en 1 (byte) o 2 (palabra).

Ejemplo: MOV DI, OFFSET Buffer_Byte


MOV CX,LENGHT Buffer_Byte
MOV AL,"A"
REP STOSB ;Llena de "A" el buffer.

Banderas afectadas: Ninguna

- SUB (Resta).
Resta el operando destino (izquierdo) menos el origen (derecho) y el resultado se almacena en el destino.

Ejemplos: (análogos a ADC)

-TEST (comparacion lógica, o sea, and lógico).


4-15
Se ejecuta una operación AND lógico entre los dos operandos y solo se afectan las
banderas.

Ejemplos: TEST AX, DX


TEST BH, CL
TEST MEM_WORD, SI
TEST AX,8000H

- WAIT (Espera por que trabaje el coprocesador).


Vigila el valor del pin *TEST del microprocesador y si está en "1" mantiene la vigilia no ejecutando ninguna
otra instrucción excepto si se produce una interrupción. Si *TEST es 0 se pasa a la siguiente instrucción.
Si se provoca una interrupción cuando se retorne se retorna al WAIT nuevamente.

- XCHG (Intercambia).
Se intercambia el contenido de los operandos en la instrucción, los cuales deben ser del mismo tipo, o sea,
bytes o palabras. Intercambia registros o registros con memoria, nunca con registros de segmento.

Banderas afectadas: Ninguna

Ejemplo: XCHG AX, BX


XCHG SI, [DI]
XCHG BETA_WORD, CX
XCHG BL, AL

- XLAT/XLATB (Traduce en tabla).


El contenido del acumulador es sustituido por un byte de una tabla cuya dirección inicial se encuentra en
BX. El contenido original de AL es el desplazamiento dentro de la tabla.

(AL) <--- ((BX)+(AL))

Ejemplo: MOV BX, OFFSET TABLE_NAME


XLAT

Banderas afectadas: Ninguna

- XOR (OR exclusivo).


Se efectúa una operación OR-exclusivo bit a bit entre los operandos. El resultado se almacena en el destino. CF
= OF = 0.

Ejemplos: Como los del ADC.

Banderas afectadas: CF, OF, PF, SF, ZF


Banderas no definidas: AF

4-16

S-ar putea să vă placă și