SlideShare una empresa de Scribd logo
1 de 51
Descargar para leer sin conexión
1
Instrucciones
Para las banderas tomaremos las siguientes convenciones: c(cambia), n(no cambia)
O: Bandera de desbordamiento (Overflow Flag)
D: Bandera de dirección (Direction Flag)
I: Bandera de interrupciones (Interruption Flag)
T: Bandera de paso a paso (Trap flag)
S: Bandera de signo (Sign Flag)
Z: Bandera de cero (Zero Flag)
A: Bandera de acarreo auxiliar (Auxiliary carry flag)
P: Bandera de Paridad (Parity Flag)
C: Bandera de Acarreo (Carry Flag)
AAA (Ascii adjust for addition)
Sintaxis: AAA
Descripción: Corrige el resultado en AL de una suma de los números decimales
desempaquetados, convirtiéndolo en un valor decimal desempaquetado.
Operación: Si D3 a D0 de AL > 9 ó A = 1
AL = AL + 6
AH = AH + 1
A = 1
C = A
Bits D7 a D4 de AL = 0000b
Banderas: O D I T S Z A P C
n n n c c
Ejemplo: mov ax, 0009h ; al = 9, ah = 0
mov bl, 7 ; bl = 7
add al, bl ; ax = 0010h, A = 1
aaa ; ax = 0106h, A = 1
Operandos: No necesita operandos
AAD (Ascii adjust for division)
Sintaxis: AAD
Descripción: Realiza un ajuste del dividendo en AL antes de hacer la división de dos
números decimales desempaquetados, para que el resultado de esta
división sea un valor decimal desempaquetado.
Operación: AH = AH*10 + AL
AL = 0
Banderas: O D I T S Z A P C
n n n c c c
Ejemplo: mov ax, 0206h ; ax = 518
mov bl, 04h ; bl = 4
2
aad ; ax = 001ah
div bl ; ax = 0206h
Operando: No necesita operandos
AAM (Ascii Adjust for Multiply)
Sintaxis: AAM
Descripción: Convierte AX en un valor decimal desempaquetado después del
producto de dos números decimales desempaquetados.
Operación: AH = cociente de AL/10
AL = resto de AL/10
Banderas: O D I T S Z A P C
n n n c c
Ejemplo: mov al, 06h ; al = 6
mov bl, 08h ; bl = 8
mul bl ; ax = 0030h = 48
aam ; ax = 0408h
Operandos: No necesita operandos
AAS (ASCII Adjust for Subtraction)
Sintaxis: AAS
Descripción: Convierte AL en un valor decimal desempaquetado después de la resta
de dos números decimales desempaquetados.
Operación: Si D3 a D0 de AL > 9 ó la bandera A = 1 entonces
AL = AL – 6
AH = AH – 1
Banderas: A = 1, C = A
D7 a D4 de AL = 0000b
Banderas: O D I T S Z A P C
n n n c c c
Ejemplo: mov al, 08h ; al = 8
mov bl, 06h ; bl = 6
sub al, bl ; ax = 0002h y A = 0
aas ; ax = 0002h
mov ah, 31h ; al = 31h
mov bl, 39h ; bl = 39h
sub al, bl ; ax = 00F8h
aas ; ax = FF02h
Operando: No necesita operandos
3
ADC (Addition with carry)
Sintaxis: ADC destino, fuente
Descripción: Suma los operandos destino y fuente mas la bandera de acarreo (C), el
resultado se deposita en el operando destino. Los operandos deben ser
del mismo tipo.
Operación: destino = destino + fuente + C
Banderas: O D I T S Z A P C
c n n n c c c c c
Ejemplo: mov al, 101 ; al = 65h
mov bl, 155 ; bl = 9Bh
add al, bl ; ax = 0500h, C = 1
adc al, 3 ; ax = 0504h
Operandos: adc registro 8, registro 8
adc registro 16, registro 16
adc registro 8, memoria 8
adc registro 16, memoria 16
adc memoria 8, registro 8
adc memoria 16, registro 16
adc registro 8, 30
adc registro 16, 124h
adc memoria 8, 25h
adc memoria 16, 1409h
ADD (Addition)
Sintaxis: AAD destino, fuente
Descripción: Suma los operandos destino y fuente, el resultado se deposita en el
operando destino. Los operandos deben ser del mismo tipo.
Operación: AL = AH * 10 + AL
AH = 0
Banderas: O D I T S Z A P C
c n n n c c c c c
Ejemplo: mov al, 101 ; al = 65h
mov bl, 155 ; bl = 9Bh
add al, bl ; ax = 0500h
Tipos de operando:
add registro 8, registro 8
add registro 16, registro 16
add registro 8, memoria 8
add registro 16, memoria 16
add memoria 8, registro 8
add memoria 16, registro 16
add registro 8, 30
4
add registro 16, 124h
add memoria 8, 25h
add memoria 16, 1409h
AND (Logical and)
Sintaxis: AND destino, fuente
Descripción: “Y lógico” a nivel de bits, el resultado se deposita en el operando
destino. Los operandos deben ser del mismo tipo.
Operación: destino = destino “Y lógico” fuente
Banderas: O D I T S Z A P C
n n n n c c n n n
Ejemplo: mov ax, 3332h ; AH = ASCII de 3, ASCII de 2
and ax, 0F0Fh ; AX = 0302h
Operandos: and registro 8, registro 8
and registro 16, registro 16
and registro 8, memoria 8
and registro 16, memoria 16
and memoria 8, registro 8
and memoria 16, registro 16
and registro 8,101b
and registro 16, 124h
and memoria 8, 25h
and memoria 16, 1409h
CALL (Call a procedure)
Sintaxis: CALL destino
Descripción: Bifurca a un procedimiento fuera de línea, salvando previamente en la
pila la dirección de la instrucción siguiente, para poder volver a esta
instrucción una vez ejecutado el procedimiento
Operación: Si la llamada esta dentro del mismo segmento (NEAR)
SP = SP - 2
IP actual a la pila
IP = desplazamiento de destino
Si la llamada está en otro segmento (FAR)
SP = SP – 2
CS actual a la pila
CS = segmento de destino
SP = SP – 2
IP actual a la pila
IP = desplazamiento de destino
Llamadas:
Directa: A etiquetas relativas a CS, no a variables. Si no se especifica nada, se
supone NEAR. Si se requiere se puede explicitar FAR
5
Indirecta: A variables, donde se puede especificar WORD PTR o DWORD PTR
para llamadas NEAR o FAR, respectivamente.
Si se especifica una nueva dirección tipo WORD, el contenido de esa
palabra es la nueva dirección (desplazamiento).
Si se especifica una nueva dirección tipo DWORD, la primera palabra
contiene el segmento y la segunda palabra el desplazamiento
También se puede utilizar registros de 16 bits entre corchetes.
Para retornar de un procedimiento se utiliza la instrucción RET
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplos: call otro ; Llamada directa al procedimiento “otro”
call word ptr otro ; Llamada NEAR indirecta
call word ptr [bx]
call dword ptr otro ; Llamada FAR indirecta
call dword ptr [bx]
Operandos: call nombre de procedimiento cercano
call word ptr memoria 16
call nombre de procedimiento lejano
call dword ptr memoria 32
CBW (Convert byte to word)
Sintaxis: CBW
Descripción: Copia el bit 7 del registro AL en todos los bits del registro AH; es decir,
se expande el bit de signo.
Operación: Si AL < 80h
AH = 00h
De otro modo
AH = FFh
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: mov al, 80h
cbw ; ax = FF80h
mov al, 05h
cbw ; ax = 0005h
Tipos de operando: No necesita operandos
6
CLC (Clear carry flag)
Sintaxis: CLC
Descripción: Borra la bandera de acarreo sin afectar a ninguna otra bandera.
Operación: C = 0
Banderas: O D I T S Z A P C
n n n n n n n n 0
Ejemplo: clc ; C = 0
Operandos: No necesita operandos
CLD (Clear direction flag)
Sintaxis: CLD
Descripción: Borra la bandera de dirección, que ocasiona, que en la ejecución de
instrucciones de manejo de cadenas de caracteres los registros índice
SI y/o DI se autoincrementen de modo automático.
Si los operandos son tipo byte se incrementa en 1
Si los operandos son tipo word se incrementa en 2
Operación: D = 0
Banderas: O D I T S Z A P C
n 0 n n n n n n n
Ejemplo: cld ; D = 0
Operandos: No necesita operandos
CLI (Clear interrupt flag)
Sintaxis: CLI
Descripción: Borra la bandera de interrupciones sin afectar a ninguna otra bandera.
Cuando I = 0 el microprocesador no acepta interrupciones
enmascarables.
Operación: I = 0
Banderas: O D I T S Z A P C
n n 0 n n n n n n
Ejemplo: cli ; I = 0
Operandos: No necesita operandos
7
CMC (Complement carry flag)
Sintaxis: CMC
Descripción: Complementa la bandera de acarreo.
Operación: Si C = 0, entonces C = 1
Si C = 1, entonces C = 0
Banderas: O D I T S Z A P C
n n n n n n n n x
Ejemplo: cmc ; Complementa C
Operando: No necesita operandos
CMP (Compare two operands)
Sintaxis: CMP destino, fuente
Descripción: Resta fuente de destino, pero no retorna resultado. Los operandos no
se alteran, pero las banderas se actualizan y pueden utilizarse en
instrucciones de bifurcación condicional. Los operandos pueden ser tipo
byte o tipo word, pero ambos del mismo tipo.
Operación: destino - fuente
Banderas: O D I T S Z A P C
c n n n c c c c c
Ejemplo: cmp ax, bx ; Compara AX con BX
Operandos: cmp registro 8, registro 8
cmp registro 16, registro 16
cmp registro 8, memoria 8
cmp registro 16, registro 16
cmp memoria 8, registro 8
cmp memoria 16, registro 16
cmp registro 8, numero
cmp registro 16, numero
cmp memoria 8, numero
cmp memoria 16, numero
CMPS (Compare string)
CMPSB (Compare string byte)
CMPSW (Compare string word)
Sintaxis: CMPS/CMPSB/CMPSW cadena_destino, cadena_fuente
Descripción: Compara dos zonas de memoria (tipo byte o tipo word) realizando la
operación cadena_fuente – cadena_destino. Esta operación afecta las
banderas pero no se guarda el resultado. La cadena fuente esta
direccionada por SI y la cadena destino por DI en el segmento de datos,
realizándose por tanto la operación DS:[SI] – DS:[DI].
8
Los registros SI y DI se actualizan en 1 si las cadenas son tipo byte y en
2 si las cadenas son tipo word.
Si la bandera de dirección D = 0, los registros SI y DI se incrementan
(ver instrucción CLD)
Si la bandera de dirección D = 1, los registros SI y DI se decrementan
(ver instrucción STD).
En la instrucción CMPSB se realiza la resta entre bytes: DS:[SI] – DS:
[DI].
En la instrucción CMPSW se realiza la resta entre words: DS:[SI] – DS:
[DI].
Importante. Si se especifican operandos en la instrucción CMPS, solo
se utilizan para verificar el tipo (byte o word) y ver si se ha especificado
un registro de segmento. Es decir CMPS en realidad no utiliza sus
operandos para realizar la operación DS:[SI] – DS:[DI].
Delante de las instrucciones CMPS, CMPSB y CMPSW se pueden
utilizar los prefijos REPE (REPZ) o REPNE (REPNZ) o REP, para
comparar dos cadenas completas. En este caso el número de
elementos a comparar esta en el registro CX.
En CMPS se puede reasignar el elemento fuente, pero no el destino;
por ejemplo CMPS destino, ES:fuente.
Importante. En CMPS la operación es fuente – destino al contrario que
en CMP cuya operación es destino – fuente. Esto hay que tener en
cuenta para la bifurcación después de la comparación.
Operación: cadena_fuente – cadena_destino
Banderas: O D I T S Z A P C
c n n n c c c c c
Ejemplo: lea si, origen
lea di, destino
cmp [di], [si]
jl otro
cld ; para incrementar SI y DI
mov si, offset origen
mov di, offset destino
mov cx, 20
repe cmps [DI], [SI] ; compara los elementos
; si los datos son tipo byte se puede
; reemplazar por repe cmpsb
je otro
cld ; para incrementar SI y DI
push ds ; ES = DS
pop es
mov si, offset origen
mov di, offset destino
9
mov cx, 20
repe cmps [DI], [SI] ; compara los elementos
; si los datos son tipo Word se puede
; reemplazar por repe cmpsw
je otro
Operandos: CMPS byte_destino,byte_fuente
CMPSB
CMPS Word_destino_byte_fuente
CMPSW
CWD (Convert word to doubleword)
Sintaxis: CWD
Descripción: Copia el bit 15 del registro AX en todos los bits del registro DX; es decir,
se expande el bit de signo.
Operación: Si AX < 8000h
DX = 0000h
De otro modo
DX = FFFFh
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: mov ax, C280h
cwd ; dx = FFFFh
mov ax, 0500h
cbw ; dx = 0000h
Operandos: No necesita operandos
DAA (Decimal adjust for addition)
Sintaxis: DAA
Descripción: Corrige el resultado de AL después de la suma de dos números
decimales empaquetados. El resultado en AL es un número decimal
empaquetado.
Operación: Si D3 a D0 de AL > 9 o A = 1
AL = AL + 6 y A = 1
Si AL > 9Fh o C = 1
AL = AL + 60h y C = 1
Banderas: O D I T S Z A P C
n n n c c c c c
Ejemplo: mov al, 64h ; ax = 0064h
mov bl, 73h
add al, bl ; ax = 00D7h
daa ; ax = 0037h y C = 1
10
mov al, 13h
mov bl, 28h
add al, bl ; ax = 003Bh
daa ; ax = 0041h y A = 1
Operandos: No necesita operandos
DAS (Decimal adjust for addition)
Sintaxis: DAS
Descripción: Corrige el resultado en AL después de la resta de dos números
decimales empaquetados. El resultado en AL es un número decimal
empaquetado.
Operación: Si D3 a D0 de AL > 9 o A = 1
AL = AL - 6 y A = 1
Si AL > 9Fh o C = 1
AL = AL - 60h y C = 1
Banderas: O D I T S Z A P C
n n n n c c c c c
Ejemplo: mov al,73h ; ax = 0073h
mov bl,28h
sub al,bl ; ax = 004Bh
das ; ax = 0045h
Operandos: No necesita operandos
DEC (Decrement destination by one)
Sintaxis: DEC destino
Descripción: Resta en uno el operando destino. El operando puede ser byte o word.
Operación: destino = destino - 1
Banderas: O D I T S Z A P C
c n n n c c c c n
Ejemplo: mov cx, 1964h
dec cx ; cx = 1963
Operandos: dec registro 8
dec registro 16
dec memoria 8
dec memoria 16
DIV (Division, unsigned)
Sintaxis: DIV fuente
Descripción: Divide, sin tomar en cuenta el signo, AX entre fuente (byte). El cociente
se guarda en AL y el resto en AH.
11
Divide, sin tomar en cuenta el signo, DX:AX entre fuente (word). El
cociente se guarda en AX y el resto en DX.
Si el cociente es mayor que el valor máximo que se puede almacenar
en AL = FFh ó AX = FFFFh, se produce una interrupción tipo cero.
Si C = 1 y O = 1, significa que los datos en AH o en DX son parte del
resultado, contienen el resto.
Operación: Si AX / fuente byte
AL = cociente; si AL > FFh se genera int 0
AH = resto
Si DX:AX / fuente word
AX = cociente; si AX = FFFFh segenera int 0
DX = resto
Banderas: O D I T S Z A P C
n n n
Ejemplo: mov ax,0013h
mov bl,2
div bl ; AH = 03 (resto), AL = 06 (cociente)
mov dx,0
mov ax,0013h
mov bx,0002
div bx ; DX = 0003 (resto), AX = 0006 (cociente)
Operandos: div registro 8
div registro 16
div memoria 8
div memoria 16
ESC (Escape)
Sintaxis: ESC código de operación externo,fuente
Descripción: Se utiliza para permitir la comunicación con otros procesadores.
ESC se utiliza en combinación con WAIT. Con la instrucción WAIT se
detiene el 8086/8088 hasta que el otro procesador acabe lo que está
haciendo. Normalmente WAIT se sitúa delante de ESC, para asegurar
que el código de operación sea recogido por el otro procesador.
El primer operando es un valor inmediato entre 0 y 3Fh y sirve para
denotar al otro procesador y la operación que debe realizar este.
El segundo operando puede ser un registro o un aposición de memoria
donde se especifica el dato a pasar al otro procesador. Si el segundo
operando es un registro el 8086/8088 no hace nada. Si el segundo
operando es una dirección de memoria, el 8080/8088 envía el contenido
apuntado por esa dirección al bus de datos, este dato es ignorado por el
8086/8088, pero puede ser capturado por el otro procesador.
12
Operación: Si fuente es un registro
Ninguna operación
Si fuente es una dirección de memoria
Bus de datos = contenido de fuente
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: wait ; Espera a que el otro procesador
; acabe con la operación en curso
esc 21,variable ; Bus de datos = contenido de VARIABLE
; pasa información al otro coprocesador
Operandos: esc 21, registro 8
esc 21, registro 16
esc 21, memoria 8
HLT (Halt)
Sintaxis: HLT
Descripción: El 8086/8088 se detiene y abandona este estado en uno de los
siguientes casos:
1. Se reinicializa el sistema (RESET)
2. Se recibe una interrupción NMI
3. Se recibe una interrupción INTR (si I = 1)
Operación: destino = destino - 1
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: hlt ; se detiene el procesador
Operandos: No necesita operandos
IDIV (Integer division, signed)
Sintaxis: IDIV fuente
Descripción: Divide, tomando en cuenta el signo, AX entre fuente (byte). El cociente
se guarda en AL y el resto en AH.
Divide, tomando en cuenta el signo, DX:AX entre fuente (word). El
cociente se guarda en AX y el resto en DX.
Si el cociente es positivo y mayor que el valor máximo que se puede
almacenar en AL = 7Fh = 127 ó AX = 7FFFh = 32767 ó si el cociente es
negativo e inferior que el valor mínimo que se puede almacenar en AL =
81h = -127 ó AX = 8001h = -32767, se produce una interrupción tipo
cero.
Si C = 1 y O = 1, significa que los datos en AH o en DX son parte del
resultado, contienen el resto.
13
Operación: Si AX / fuente byte
AL = cociente; si AL > 7Fh ó AL < 81h se genera int 0
AH = resto
Si DX:AX / fuente word
AX = cociente; si AX = 7FFFh ó AX < 8001h se genera int 0
DX = resto
Banderas: O D I T S Z A P C
n n n
Ejemplo: mov ax, -13h ; AX = FFF3h
mov bl, 2
idiv bl ; AH = FFh = -01 (resto)
; AL = FAh = -06 (cociente)
mov ax, -13h ; AX = FFFAh
cwd ; DX = FFFFh y AX = FFFAh
mov bx, 0002
idiv bx ; DX = FFFFh = -0001(resto)
; AX = FFFAh = -0006 (cociente)
Operandos: idiv registro 8
idiv registro 16
idiv memoria 8
idiv memoria 16
IMUL (Integer multiply, signed)
Sintaxis: IMUL fuente
Descripción: Multiplica, tomando en cuenta el signo, AL por fuente (byte). El producto
se guarda en AX.
Multiplica, tomando en cuenta el signo, AX por fuente (word). El
producto se guarda en DX:AX.
Si C = 1 y O = 1, significa que los datos en AH o en DX son parte del
resultado, no representan el signo.
Operación: Si fuente byte
AX = AL * fuente
Si fuente word
DX:AX = AX * fuente
Si la mitad superior del resultado es la expansión del signo de la mitad
Inferior del resultado, entonces C = 0, caso contrario C = 1 y C = O
Banderas: O D I T S Z A P C
c n n n c
Ejemplo: mov al,-13h ; AL = FFF3h
mov bl, 2
imul bl ; AX = FFE6h = -26
mov ax, -13h ; AX = FFF3h
mov bx, 0002
14
imul bx ; DX:AX = FFFF:FFE6 = -26
; C = 0 y O = 0
mov ax, -1964h ; AX = F854h
mov bx, 1973 ; BX = 07B5h
imul bx ; DX:AX = FFC4:DF64 = -3874972
; C = 1 y O = 1
Operandos: imul registro 8
imul registro 16
imul memoria 8
imul memoria 16
IN (Input byte o word)
Sintaxis: IN acumulador, puerta
Descripción: Transfiere un byte o una palabra de una puerta de entrada del
procesador al registro AL o AX.
La puerta puede ser un valor entre 0 y 255, por ejemplo IN al,31h
La puerta pueda ser un valor entre 0 y 65535, por ejemplo IN al,dx
Operación: Si acumulador = AL
AL = dato de la puerta
Si acumulador = AX
AX = dato de la puerta
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: in al, 31h
mov dx, 03f8h
in al, dx
Operandos: in al, valor entre 0 y 255
in ax, valor entre 0 y 255
in al, dx
in ax, dx
INC (Increment destination by one)
Sintaxis: INC destino
Descripción: Suma en uno el operando destino. El operando puede ser byte o word.
Operación: destino = destino + 1
Banderas: O D I T S Z A P C
c n n n c c c c n
Ejemplo: mov cx, 1964h
inc cx ; cx = 1965
15
Operandos: inc registro 8
inc registro 16
inc memoria 8
inc memoria 16
INT (Interrupt)
Sintaxis: INT tipo_interrupción
Descripción: INT activa la interrupción especificada por operando. La dirección del
vector de interrupción se calcula multiplicando el operando (entre 0 y
255) por cuatro.
El vector de interrupción se compone de: IP = primera palabra y CS =
segunda palabra.
Antes de atender la interrupción, se guarda en la pila: el registro de
banderas y la dirección de retorno (CS, IP)
Para retornar de una interrupción se utiliza IRET.
Operación: SP = SP – 2
Banderas a la pila
I = 0 y T = 0
SP = SP – 2
CS a la pila
CS = tipo_interrupción*4 + 2
SP = SP – 2
IP a la pila
IP = tipo de interrupción*4
Banderas: O D I T S Z A P C
n n c c n n n n n
Ejemplo: mov ah, 02
mov dx, 1010h
int 10h
Operandos: int
INTO (Interrupt if overflow)
Sintaxis: INTO
Descripción: Genera una interrupción tipo 4 si existe desbordamiento, es decir, si O =
1, de otro modo se continua con la ejecución de las instrucciones
siguientes, sin ejecutar el procedimiento de interrupción.
Operación: Si O = 1
SP = SP - 2
Banderas a la pila
I = 0 y T = 0
SP = SP – 2
CS a la pila
16
CS = tipo_interrupción_4*4 + 2
SP = SP – 2
IP a la pila
IP = tipo_interrupción_4*4
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: into
Operandos: No necesita operandos
IRET (Interrupt return)
Sintaxis: IRET
Descripción: Devuelve el control a la dirección de retorno salvada en la pila por una
operación de interrupción previa y restaura las banderas. IRET se utiliza
para finalizar un procedimiento de interrupción.
Operación: Recupera IP de la pila
SP = SP + 2
Recupera CS de la pila
SP = SP + 2
Recupera banderas de la pila
Banderas: O D I T S Z A P C
c c c c c c c c c
Ejemplo: iret
Operandos: No necesita operandos
JA/JNBE (Jump if above/Jump if not below nor equal)
Sintaxis: JA Desplazamiento
JNBE Desplazamiento
Descripción: Si C = 0 y Z = 0
Transfiere el control a la instrucción (IP + desplazamiento)
Si C = 1 o Z = 1
No se transfiere el control
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Above (por encima de) y Below (por debajo) se refiere a la relación
entre dos valores sin signo.
Greater (mayor que) y Less (menor que) se refiere a la relación entre
dos valores con signo.
Operación: Si C = 0 y Z = 0
IP = IP + desplazamiento
17
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: cmp ax,20 ; compara AX con 20
ja otro ; si AX > 20, salta sin considerar el signo
Operandos: ja otro
jnbe otro
JAE/JNB (Jump if above or equal/Jump if not below)
Sintaxis: JAE Desplazamiento
JNB Desplazamiento
Descripción: Si C = 0, transfiere el control a la instrucción (IP + desplazamiento)
Si C = 1, no se transfiere el control.
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Above (por encima de) y Below (por debajo) se refiere a la relación
entre dos valores sin signo.
Greater (mayor que) y Less (menor que) se refiere a la relación entre
dos valores con signo.
Operación: Si C = 0 y Z = 0
IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: cmp ax, 20 ; Compara AX con 20
jae otro ; Si AX = 20, salta sin considerar el signo
Operandos: jae otro
jne otro
JB/JNAE/JC (Jump if below/Jump if not above or equal/Jump If carry)
Sintaxis: JB Desplazamiento
JNAE Desplazamiento
JC Desplazamiento
Descripción: Si C = 1,transfiere el control a la instrucción (IP + desplazamiento)
Si C = 0, no se transfiere el control
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Above (por encima de) y Below (por debajo) se refiere a la relación
entre dos valores sin signo.
18
Greater (mayor que) y Less (menor que) se refiere a la relación entre
dos valores con signo.
Operación: Si C = 1, IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n N n n
Ejemplo: cmp ax, 20 ; Compara AX con 20
jb otro ; Si AX < 20 salta sin considerar el signo
Operandos: jb otro
jnae otro
jc otro
JBE/JNA (Jump if below or equal/Jump if not above)
Sintaxis: JBE Desplazamiento
JNA Desplazamiento
Descripción: Si C = 1 o Z = 1, transfiere el control a la instrucción (IP +
desplazamiento)
Si C = 0 y Z = 0, no se transfiere el control
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Above (por encima de) y Below (por debajo) se refiere a la relación
entre dos valores sin signo.
Greater (mayor que) y Less (menor que) se refiere a la relación entre
dos valores con signo.
Operación: Si C = 1 o Z = 1, IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n N n n
Ejemplo: cmp ax, 20 ; Compara AX con 20
jbe otro ; Si AX = 20 salta sin considerar el signo
Operandos: jbe otro
jna otro
JCXZ (Jump if CX is zero)
Sintaxis: JCXZ Desplazamiento
Descripción: Si CX = 0, transfiere el control a la instrucción (IP + desplazamiento)
Si CX ≠ 0, no se transfiere el control
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
19
Esta instrucción se puede utilizar al inicio de un bucle para no ejecutarlo
en caso de que CX = 0.
Operación: Si CX = 0, IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n N n n
Ejemplo: dec cx ;
jcxz otro ; Si CX = 0 salta a otro
Operandos: jcxz otro
JE/JZ (Jump if equal/Jump if zero)
Sintaxis: JE Desplazamiento
JZ Desplazamiento
Descripción: Si Z = 1, transfiere el control a la instrucción (IP + desplazamiento)
Si Z = 0, no se transfiere el control
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Operación: Si Z = 1, IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n N n n
Ejemplo: cmp ax, 20 ; Compara AX con 20
je etiqueta ; Si AX = 20 salta a etiqueta
sub cx,ax
jz otro ; Si CX = 0 salta a otro
Operandos: je otro
jz otro
JG/JNLE (Jump if greater/Jump if not less nor equal)
Sintaxis: JG Desplazamiento
JNLE Desplazamiento
Descripción: Si Z = 0 y S = O, transfiere el control a la instrucción (IP +
desplazamiento)
Si Z = 1 y S ? O, no se transfiere el control
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Above (por encima de) y Below (por debajo) se refiere a la relación
entre dos valores sin signo.
Greater (mayor que) y Less (menor que) se refiere a la relación entre
dos valores con signo.
20
Operación: Si Z = 0 y S = O, IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n N n n
Ejemplo: cmp ax, 20 ; Compara AX con 20
jg otro ; Si AX > 20 salta considerando el signo
Operandos: jg otro
jnle otro
JGE/JNL (Jump if greater equal/Jump if not less)
Sintaxis: JGE Desplazamiento
JNL Desplazamiento
Descripción: Si S = O, transfiere el control a la instrucción (IP + desplazamiento)
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Above (por encima de) y Below (por debajo) se refiere a la relación
entre dos valores sin signo.
Greater (mayor que) y Less (menor que) se refiere a la relación entre
dos valores con signo.
Operación: Si S = O, IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n N n n
Ejemplo: cmp ax, 20 ; Compara AX con 20
jge otro ; Si AX = 20 salta considerando el signo
Operandos: jge otro
jnl otro
JL/JNGE (Jump if less/Jump if not greater nor equal)
Sintaxis: JG Desplazamiento
JNLE Desplazamiento
Descripción: Si Z = 0 y S = O, transfiere el control a la instrucción (IP +
desplazamiento)
Si Z = 1 y S ≠ O, no se transfiere el control
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Above (por encima de) y Below (por debajo) se refiere a la relación
entre dos valores sin signo.
21
Greater (mayor que) y Less (menor que) se refiere a la relación entre
dos valores con signo.
Operación: Si Z = 0 y S = O, IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n N n n
Ejemplo: cmp ax, 20 ; Compara AX con 20
jl otro ; Si AX < 20 salta considerando el signo
Operandos: jl otro
jnge otro
JLE/JNG (Jump if less or equal/Jump if not greater)
Sintaxis: JLE Desplazamiento
JNG Desplazamiento
Descripción: Si Z = 1 o S ≠ O, transfiere el control a la instrucción (IP
+desplazamiento)
Si Z = 0 y S = O, no se transfiere el control
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Above (por encima de) y Below (por debajo) se refiere a la relación
entre dos valores sin signo.
Greater (mayor que) y Less (menor que) se refiere a la relación entre
dos valores con signo.
Operación: Si Z = 1 o S ≠ O, IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: cmp ax, 20 ; Compara AX con 20
jle otro ; Si AX = 20 salta considerando el signo
Operandos: jle otro
jng otro
JMP (Jump)
Sintaxis: JMP dirección
Descripción: Transfiere el control incondicionalmente
La transferencia del control puede ser:
 Dentro del mismo segmento. Es decir se reemplaza IP por la
dirección especificada en el operando. Este desplazamiento puede
estar:
22
o Entre -128 y 127 bytes, generándose una instrucción de dos
bytes Inferior a -128 o superior a 127 bytes, pudiendo ser el
desplazamiento
o hasta de 32k bytes. En este saso se genera una instrucción
de tres bytes.
 Distinto segmento. Es decir: CS e IP se sustituyen por los valores
de la dirección especificada en el operando.
 La transferencia del control también puede ser:
o Directa, es decir especificando una etiqueta
o Indirecta, es decir especificando una dirección.
Operación: Si la transferencia del control es a distinto segmento
CS = segmento
IP = desplazamiento
Si la transferencia del control es dentro del mismo segmento
IP = desplazamiento con signo
Banderas: O D I T S Z A P C
n n n n n n N n n
Ejemplo: jmp otro ; Salta a otro
jmp far ptr otro ; Salta (directo) a otro segmento
jmp [bx] ; Salta (indirecto) dentro el mismo segmento
jmp far ptr [bx] ; Salta (indirecto) a otro segmento
otro dw proc01 ; Desplazamiento de proc01, definido en DS
jmp otro ; Salta a otro (indirecto) dentro
; del mismo segmento
otro dd proc01 ; Desplazamiento de proc01, definido en DS
jmp otro ; Salta a otro (indirecto) a otro segmento
Operandos: jmp etiqueta
jmp short etiqueta
jmp etiqueta[DI]
jmp far ptr etiqueta
jmp far ptr etiqueta[DI]
JNC (Jump if not carry)
Sintaxis: JNC Desplazamiento
Descripción: Si C = 0, transfiere el control a la instrucción (IP + desplazamiento)
Si C = 1, no se transfiere el control
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Operación: Si C = 0, IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n n n n
23
Ejemplo: add al,bl
jnc otro ; Si C = 0, salta a otro
Operandos: jnc otro
JNE/JNZ (Jump if not equal/Jump if not zero)
Sintaxis: JNE Desplazamiento
JNZ Desplazamiento
Descripción: Si Z = 0, transfiere el control a la instrucción (IP + desplazamiento)
Si Z = 1, no se transfiere el control
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Above (por encima de) y Below (por debajo) se refiere a la relación
entre dos valores sin signo.
Greater (mayor que) y Less (menor que) se refiere a la relación entre
dos valores con signo.
Operación: Si Z = 0, IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: cmp ax,20 ; Compara AX con 20
jne otro ; Si AX ≠ 20 salta a otro
sub al,bl
jnz otro ; Si AL ≠ 0 salta a otro
Operandos: jne otro
jnz otro
JNO (Jump if not overflow)
Sintaxis: JNO Desplazamiento
Descripción: Si O = 0, transfiere el control a la instrucción (IP + desplazamiento)
Si O = 1, no se transfiere el control
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Operación: Si O = 0, IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n n n n
24
Ejemplo: add ax,20
jno otro ; Si O = 0, salta a otro
Operandos: jno otro
JNP/JPO (Jump if not parity/Jump if parity odd)
Sintaxis: JNP Desplazamiento
JPO Desplazamiento
Descripción: Si P = 0, transfiere el control a la instrucción (IP + desplazamiento)
Si P = 1, no se transfiere el control
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Operación: Si P = 0, IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: add ax, 20
jnp otro ; Si P = 0, salta a otro
Operandos: jnp otro
jpo otro
JNS(Jump if not sign)
Sintaxis: JNS Desplazamiento
Descripción: Si S = 0, transfiere el control a la instrucción (IP + desplazamiento)
Si S = 1, no se transfiere el control
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Operación: Si S = 0, IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: sub ax, 20 ; Compara AX con 20
jns otro ; Si AX = 20 salta a otro
Operandos: jns otro
JO (Jump if overflow)
Sintaxis: JO Desplazamiento
Descripción: Si O = 1, transfiere el control a la instrucción (IP + desplazamiento)
Si O = 0, no se transfiere el control
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
25
Operación: Si O = 1, IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: add ax, 20
jle otro ; Si O = 1, salta a otro
Operandos: jo otro
JP/JPE (Jump on parity/Jump if parity even)
Sintaxis: JP Desplazamiento
JPE Desplazamiento
Descripción: Si P = 1, transfiere el control a la instrucción (IP + desplazamiento)
Si P = 0, no se transfiere el control
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Operación: Si P = 1, IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: add ax, 20
jp otro ; Si P = 1, salta a otro
Operandos: jp otro
jpe otro
JS (Jump on sign)
Sintaxis: JS Desplazamiento
Descripción: Si S = 1, transfiere el control a la instrucción (IP + desplazamiento)
Si S = 0, no se transfiere el control
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Operación: Si S = 1, IP = IP + desplazamiento
(el signo del desplazamiento se extiende a 16 bits)
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: sub ax, 20
js otro ; Si AX < 0 salta a otro
Operandos: js otro
26
LAHF (Load register AH from flags)
Sintaxis: LAHF
Descripción: Copia las banderas S, Z, A, P y C en los bits 7, 6, 4, 2 y 0
respectivamente. Los bits 5, 3, y 1 quedan indefinidos.
Operación: AH = S Z x A x P x C
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: lahf
Operandos: No necesita operandos.
LDS (Load data segment register)
Sintaxis: LDS destino,fuente
Descripción: Transfiere un puntero de 32 bits a DS:destino(desplazamiento), desde la
dirección apuntada por fuente. El operador fuente tiene que estar
apuntando a una zona de memoria tipo DD.
Operador destino = desplazamiento (palabra inferior)
DS = segmento (palabra superior)
Operación: DS = palabra apuntada por (fuente + 2)
destino = fuente
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: en el segmento de datos
Puntero dd 12345678h ; En DS:0000 78 56 34 12 .. ..
En el segmento de código
lds si, Puntero ; DS = 1234h
; SI = 5678h
lea si, Puntero ; SI = 0
lds bx, [si] ; DS = 1234h
; BX = 5678h
Operandos: lds si, dirección de memoria
lds di, dirección de memoria
lds bx, dirección de memoria
27
LEA (Load effective address)
Sintaxis: LEA destino,fuente
Descripción: Transfiere el desplazamiento del operando fuente al operando destino.
La fuente tiene que ser una dirección de memoria y el destino tiene que
ser un registro de 16 bits que no sea registro de segmento.
LEA permite especificar registros índice en el operando fuente, lo que
no es posible con el operador OFFSET.
Operación: destino = desplazamiento de fuente.
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: en el segmento de datos
hola db “hola” ; DS:0000 68 6F 6C 61
db “cuate” ; DS:0003 63 75 61 74 65
En el segmento de código
mov si, 4
lea bx, hola[si] ; BX = 0004
Operandos: lea si, dirección de memoria
lea di, dirección de memoria
lea bx, dirección de memoria
LES (Load extra segment register)
Sintaxis: LES destino, fuente
Descripción: Transfiere un puntero de 32 bits a ES:destino(desplazamiento), desde la
dirección apuntada por fuente. El operador fuente tiene que estar
apuntando a una zona de memoria tipo DD.
Operador destino = desplazamiento (palabra inferior)
ES = segmento (palabra superior)
Operación: ES = palabra apuntada por (fuente + 2)
destino = fuente
Banderas: O D I T S Z A P C
n n n n N n n n n
Ejemplo: en el segmento de datos
Puntero dd 12345678h ; En DS:0000 78 56 34 12 .. ..
En el segmento de código
les si, Puntero ; ES = 1234h
; SI = 5678h
lea si, Puntero ; SI = 0
les bx, [si] ; ES = 1234h
; BX = 5678h
28
Operandos: les si, dirección de memoria
les di, dirección de memoria
les bx, dirección de memoria
LOCK (Lock the bus)
Sintaxis: LOCK
Descripción: LOCK es un prefijo de un byte que acompaña a una instrucción y que
activa la señal mientras dicha instrucción se ejecuta, es decir impide
que otros procesadores utilicen el bus.
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: en el segmento de datos
semaforo db 0
En el segmento de código
check:
mov al, 1
lock xchg semaforo, al ; semáforo = 1 (rojo)
cmp al, 1 ; ¿semáforo = rojo?
je check ; si semáforo esta rojo sigue
; bloqueando el bus
; sino continua con el proceso
;
; Proceso cualquiera
;
; Después de realizar el proceso, poner el
; semáforo en verde (valor 0)
; para permitir que otros procesadores
; accedan al bus
;
mov semaforo,0 ; libera el bus
Operandos: lock instrucion
LODS (Load string)
LODSB (Load string byte)
LODSW (Load string word)
Sintaxis: LODS destino,fuente
LODSB
LODSW
Descripción: Transfiere un byte o un apalabra de la cadena fuente, apuntada por
DS:SI, al acumulador AL o AX. Actualiza SI para que apunte al siguiente
elemento de la cadena a cargar.
Si la bandera D = 0, entonces SI se incremente pero si D = 1, entonces
SI se decrementa (ver las instrucciones STD y CLD).
La instrucción LODSB carga el registro AL con el dato apuntado por DS:
[SI] y se actualiza SI en uno.
29
La instrucción LODSW carga el registro AX con el dato apuntado por
DS:[SI] y se actualiza SI en dos.
El ensamblador utiliza el operando especificado en LODS solo para
verificar el tipo (byte o word) y para ver si se ha especificado un registro
de segmento.
Operación: Si D = 0 y DS:[SI] = fuente tipo byte, entonces AL = fuente y SI = SI +1
Si D = 0 y DS:[SI] = fuente tipo word, entonces AX = fuente y SI = SI + 2
Si D = 1 y DS:[SI] = fuente tipo byte, entonces AL = fuente y SI = SI – 1
Si D = 1 y DS:[SI] = fuente tipo word, entonces AX = fuente y SI = SI - 2
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo1: en el segmento de datos
datos db ‘La verdad’
En el segmento de código
cld
lea si,datos
lods datos
;
; Como la cadena es tipo byte la última instrucción se puede reemplazar
; por
;
lodsb
Ejemplo2: en el segmento de datos
datos dw ‘La verdad’
En el segmento de código
cld
lea si,datos
lods datos
;
; Como la cadena es tipo word la última instrucción se puede
; reemplazar
; por
;
lodsw
Operandos: lods memoria 8
lodsb
lods memoria 16
lodsw
LOOP (Loop)
Sintaxis: LOOP desplazamiento
Descripción: Decrementa CX
Si CX ≠ 0, entonces IP = IP + desplazamiento
Si CX = 0, entonces se ejecuta la siguiente instrucción.
30
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Operación: CX = CX - 1
Si CX ≠ 0, entonces IP = IP + desplazamiento
Si CX = 0, entonces se ejecuta la siguiente instrucción.
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo1: mov cx,10
…
otro:
…
loop otro
Operandos: loop etiqueta
LOOPNE (Loop if not equal)
LOOPNZ (loop if not zero)
Sintaxis: LOOPNE desplazamiento
LOOPNZ desplazamiento
Descripción: Decrementa el registro CX.
Si Z = 0 y CX ≠ 0, entonces IP = IP + desplazamiento
Si Z = 1 y CX = 0, entonces se ejecuta la siguiente instrucción.
El desplazamiento debe estar comprendido entre -128 y 127 bytes.
Operación: CX = CX - 1
Si Z = 0 y CX ≠ 0, entonces IP = IP + desplazamiento
Si Z = 1 y CX = 0, entonces se ejecuta la siguiente instrucción.
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo1: mov cx, 10
…
otro:
…
loopne otro
Operandos: loopne etiqueta
MOV (Move)
Sintaxis: mov destino, fuente
Descripción: Mueve un byte o un word desde el operando fuente al operando destino.
Ambos operandos tienen que ser del mismo tipo.
No se puede mover un valor inmediato a un registro de segmento
31
No se puede mover datos entre elementos de memoria, hay que utilizar
un registro intermedio.
No se puede utilizar CS como destino
Operación: destino = fuente.
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo1: mov cx, 10
Operandos: mov memoria 8, registro 8
mov memoria 16, registro 16
mov registro 8, memoria 8
mov registro 16, memoria 16
mov ds, memoria 16
mov ds, ax
mov memoria 16, ds
mov ax, ds
mov es, memoria 16
mov es, ax
mov memoria 16, es
mov ax, es
mov al, 28h
mov ax, 1964h
mov memoria 8, 13h
mov memoria 16, 1973h
MOVS (Move string)
MOVSB (Move string byte)
MOVSW (Move string word)
Sintaxis: MOVS cadena_destino,cadena_fuente
MOVSB
MOVSW
Descripción: Transfiere un byte o un apalabra de la cadena fuente, apuntada por
DS:SI, a la cadena destino apuntada por ES:DI. Actualiza SI y DI para
que apunte al siguiente elemento de la cadena a cargar.
Si la bandera D = 0, entonces SI y DI se incrementan pero si D = 1,
entonces SI y DI se decrementan (ver las instrucciones STD y CLD).
La instrucción MOVSB mueve un byte apuntado por DS:[SI] a ES:[DI] y
se actualiza SI y DI en uno.
La instrucción MOVSW mueve un word apuntado por DS:[SI] a ES:[DI] y
se actualiza SI y DI en dos.
32
El ensamblador utiliza el operando especificado en MOVS solo para
verificar el tipo (byte o word) y para ver si se ha especificado un registro
de segmento.
Operación: DS:[SI] = cadena_fuente tipo byte y ES:[DI] = cadena_destino tipo byte
Si D = 0 cadena_destino = cadena_fuente y SI = SI +1.
Si D = 1 cadena_destino = cadena_fuente y SI = SI – 1
DS:[SI] = cadena_fuente tipo word y ES:[DI] = cadena_destino tipo word
Si D = 0 cadena_destino = cadena_fuente y SI = SI +2.
Si D = 1 cadena_destino = cadena_fuente y SI = SI – 2
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: en el segmento de datos
origen db ' Rien n'est trop beau pour une si belle'
destino db 38 dup(0)
En el segmento de código
push ds
sub ax,ax
push ax
mov ax,datos
mov ds,ax ; debido a que DS:[SI] = fuente y
mov es,ax ; ES:[DI] = destino, hacemos ES = DS
cld
lea si,origen
lea di,destino
mov cx,38
rep movs byte ptr[di], byte ptr[si]
;
; En vez de la última instrucción es mejor utilizar rep movsb para copiar
; byte por byte y es mejor utilizar rep movsw para copiar word por word.
Oreándoos movs byte ptr [di], byte ptr [si]
movsb
movs word ptr [di], word ptr [si]
movsw
MUL (Multiply, unsigned)
Sintaxis: MUL fuente
Descripción: Multiplica, sin tomar en cuenta el signo, AL por fuente (byte). El
producto se guarda en AX.
Multiplica, sin tomar en cuenta el signo, AX por fuente (word). El
producto se guarda en DX:AX.
Si C = 1 y O = 1, significa que los datos en AH o en DX son parte del
resultado, no representan el signo.
Operación: Si fuente byte
AX = AL * fuente
33
Si fuente word
DX:AX = AX * fuente
Si la mitad superior del resultado es cero, entonces C = 0,
caso contrario C = 1 y C = O
Banderas: O D I T S Z A P C
n n n c
Ejemplo: mov al,13h ; AL = 13h
mov bl,2
mul bl ; AX = 1Ah = 26
mov ax,13h ; AX = FFF3h
mov bx,0002
mul bx ; DX:AX = 0000:001A = 26
; C = 0 y O = 0
mov ax,1964h ; AX = 07ACh
mov bx,1973 ; BX = 07B5h
mul bx ; DX:AX = 003B:209C = 3874972
; C = 1 y O = 1
Oreándoos: mul registro 8
mul registro 16
mul memoria 8
mul memoria 16
NEG (Negate)
Sintaxis: NEG destino
Descripción: Resta el operando destino de cero y devuelve el resultado en el mismo
operando.
NEG equivale a las instrucciones
NOT destino
INC
Operación: Si destino es tipo byte
destino = complemento a 1 de destino
destino = destino + 00000001b
Si destino es tipo word
destino = complemento a 1 de destino
destino = destino + 0000000000000001b
Banderas: O D I T S Z A P C
n n n c c c c c
Ejemplo: mov al,0Dh ; al = 00001101 = 13
neg al ; 11110010
; + 1
; --------------
; 11110011 = F3h = -13
Operandos: neg registro 8
34
neg registro 16
neg memoria 8
neg memoria 16
NEG (Negate)
Sintaxis: NEG destino
Descripción: Resta el operando destino de cero y devuelve el resultado en el mismo
operando.
NEG equivale a las instrucciones
NOT destino
INC
Operación: Si destino es tipo byte
destino = complemento a 1 de destino
destino = destino + 00000001b
Si destino es tipo word
destino = complemento a 1 de destino
destino = destino + 0000000000000001b
Banderas: O D I T S Z A P C
c n n n c c c c c
Ejemplo: mov al,0Dh ; al = 00001101 = 13
neg al ; 11110010
; + 1
; --------------
; 11110011 = F3h = -13
Operandos: neg registro 8
neg registro 16
neg memoria 8
neg memoria 16
NOP (No operation)
Sintaxis: NOP
Descripción: El procesador no hace nada, ejecuta la siguiente instrucción.
NEG equivale a las instrucciones
NOT destino
INC
Operación: Ninguna
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: nop
Operandos: No necesita operandos
35
NOT (Logical NOT)
Sintaxis: NOT destino
Descripción: Cambia los bits unos por ceros y viceversa, es decir realiza el
complemento a uno del operando destino y devuelve el resultado en el
mismo operando.
Operación: Si destino es tipo byte
destino = complemento a 1 de destino
Si destino es tipo word
destino = complemento a 1 de destino
Banderas: O D I T S Z A P C
n n n n n n n n N
Ejemplo: mov al,0Dh ; al = 00001101
not al ; al = 11110010
Operandos: not registro 8
not registro 16
not memoria 8
not memoria 16
OR (Logical inclusive OR)
Sintaxis: OR destino, fuente
Descripción: Operación lógica “O” inclusivo a nivel de bits entre los operandos, es
resultado se almacena en el destino. La lógica O es:
00 = 0
01 = 1
10 = 1
11 = 1
Operación: destino = destino OR fuente
C = O = 0
Banderas: O D I T S Z A P C
0 n n n c c c 0
Ejemplo: mov al, 0Dh ; al = 00001101 = 0Dh
mov bl, D0h ; bl = 11010000 = D0h
or al, bl ; al = 11011101 = DDh
Operandos: or registro 8, registro 8
or registro 8, memoria 8
or memoria 8, registro 8
or registro 8, constante
or memoria 8, constante
or registro 16, registro 16
or registro 16, memoria 16
36
or memoria 16, registro 16
or registro 16, constante
or memoria 16, constante
OUT (Output byte or word)
Sintaxis: OUT destino, acumulador
Descripción: transfiere del acumulador (AL o AX) al puerto especificado en el
operador destino.
Si el puerto es un valor entre 0 y 255, el puerto es especificado
directamente por su valor numérico.
Si el puerto es un valor entre 0 y 65535, el puerto es especificado en el
registro DX.
Operación: Si acumulador = AL
AL se transfiere al puerto
Si acumulador = AX
AX se transfiere al puerto
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: out 61h, al
mov al, 13
mov dx,03F8h
out dx, al
Operandos: out puerto 8, al
out puerto 8, ax
out dx, al
out dx, ax
POP (POP word of stack to destination)
Sintaxis: POP destino
Descripción: Transfiere un word de la pila, de la posición apuntada por el registro SP,
al operador destino, luego se incrementa el registro SP.
El operador destino no puede ser el registro CS
Operación: destino = word apuntado por SS:SP
SP = SP + 2
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: pop ax
Operandos: pop registro 16 (menos el CS)
pop memoria 16
37
POPF (POP flags of stack)
Sintaxis: POPF destino
Descripción: Transfiere los bits de un word de la pila, de la posición apuntada por el
registro SP, al registro de banderas, luego se incrementa el registro SP.
Registro de banderas = F E D C B A 9 8 7 6 5 4 3 2 1 0
0 D I T S Z A P C
Operación: Registro de banderas = word apuntado por SS:SP
SP = SP + 2
Banderas: O D I T S Z A P C
c c c c c c c c c
Ejemplo: popf
Operandos: No necesita operandos
PUSH (PUSH word onto stack)
Sintaxis: PUSH fuente
Descripción: Decrementa el puntero SP en dos y luego transfiere la palabra
especificada en el operando fuente apuntado por SP.
El operador fuente no puede ser el registro CS
Operación: SP = SP – 2
fuente = palabra apuntada por SS:SP
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: push ax
Operandos: push registro 16 (menos el CS debido a que no se acepta POP CS)
push memoria 16
PUSHF (PUSH flags ono stack)
Sintaxis: PUSH
Descripción: Decrementa el puntero SP en dos y luego transfiere los valores de las
banderas a bits específicos de la palabra apuntada por SP.
Registro de banderas = F E D C B A 9 8 7 6 5 4 3 2 1 0
0 D I T S Z A P C
Operación: SP = SP – 2
Palabra direccionada por SS:SP = registro de banderas
38
Banderas: O D I T S Z A P C
c c c c c c c c c
Ejemplo: pushf
Operandos: No necesita operandos
RCL (Rotate through carry left)
Sintaxis: RCL destino, contador
Descripción: Rotar a la izquierda los bits del operando destino a través de la bandera
de acarreo, el número de veces especificado en el contador. El bit de la
bandera C se desplaza a la posición más significativa del operando
destino.
Si el número de bits a desplazar es 1, se puede especificar
directamente, pero si el número de bits a desplazar es mayor a 1, su
valor debe cargarse en CL como segundo operando.
Operación: contador = constante
Mientras contador ≠ 0
C = bit más significativo del operando destino
Bit menos significativo del operando destino = C
contador = contador – 1
Banderas: O D I T S Z A P C
c n n n n n n n c
Ejemplo: mov cl, 4
mov al, 00110001b
rcl al,cl
Operandos: rcl registro 16, 1
rcl registro 16, cl
rcl memoria 16, 1
rcl memoria 16, cl
rcl registro 8, 1
rcl registro 8, cl
rcl memoria 8, 1
rcl memoria 8, cl
RCR (Rotate through carry right)
Sintaxis: RCR destino, contador
Descripción: Rotar a la derecha los bits del operando destino a través de la bandera
de acarreo, el número de veces especificado en el contador. El bit de la
bandera C se desplaza a la posición más significativa del operando
destino.
Si el número de bits a desplazar es 1, se puede especificar
directamente, pero si el número de bits a desplazar es mayor a 1, su
valor debe cargarse en CL como segundo operando.
39
Operación: contador = constante
Mientras contador ≠ 0
C = bit menos significativo del operando destino
Bit más significativo del operando destino = C
contador = contador – 1
Banderas: O D I T S Z A P C
c n n n n n n n c
Ejemplo: mov cl, 4
mov al, 01110011b
rcr al,cl
Operandos: rcr registro 16, 1
rcr registro 16, cl
rcr memoria 16, 1
rcr memoria 16, cl
rcr registro 8, 1
rcr registro 8, cl
rcr memoria 8, 1
rcr memoria 8, cl
REP (Repeat string operation)
REPE (Repeat string operation if equal)
REPZ (Repeat string operation if zero)
REPNE (Repeat string operation if not equal)
REPNZ (Repeat string operation if not zero)
Sintaxis: REP instrucción de cadenas
REPE instrucción de cadenas
REPZ instrucción de cadenas
REPNE instrucción de cadenas
REPNZ instrucción de cadenas
Descripción: Son prefijos que repiten una operación de cadena un número específico
de veces o hasta que se cumpla una condición de cero o no cero.
Se carga CX con un valor. Para REP la operación se repite mientras
CX ≠ 0.
Se carga CX con un valor. Para REPE/REPZ la operación se repite
mientras Z = 1 y CX ≠ 0.
Se carga CX con un valor. Para REPNE/REPNZ la operación se repite
mientras Z = 0 y CX ≠ 0.
Operación: CX = valor
REP repite la operación mientras CX ≠ 0.
REPE/REPZ repite la operación mientras Z = 1 y CX ≠ 0.
REPNE/REPNZ repite la operación mientras Z = 0 y CX ≠ 0.
En todos los casos CX = CX – 1 después de cada operación.
40
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: mov cx, 10
lea si, texto1
lea di, texto2
rep movsb
Operandos: rep instrucción de cadena
repe instrucción de cadena
repz instrucción de cadena
repne instrucción de cadena
repnz instrucción de cadena
RET (Return)
Sintaxis: RET valor
Descripción: Regresa de un procedimiento al que se entró previamente por un CALL
cercano o lejano. El ensamblador genera un RET cercano si está dentro
de un procedimiento etiquetado como NEAR y un RET lejano si está
entro de un procedimiento etiquetado como FAR.
Para el caso cercano, RET mueve la palabra en el tope de la pila al IP e
incrementa al SP en dos.
Para el caso lejano, RET mueve las palabras en el tope de la pila al IP y
CS e incrementa el SP en cuatro.
Cuando se utiliza RET valor, se realiza SP = SP + valor
Operación:
Caso cercano.
IP = [SP].
SP = SP + 2
Caso lejano.
IP = [SP] y SP = SP + 2
CS = [SP] y SP = SP + 2
Si RET valor
SP = SP + valor
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: ret
ret 4 ; Retorna de un procedimiento NEAR con dos parámetros
; de direcciones. (4 = 2 parámetros x 2 byte/parámetro)
ret 8 ; Retorna de un procedimiento FAR con dos parámetros
; de direcciones. (8 = 2 parámetros x 4 byte/parámetro)
Operandos: ret
ret valor
41
ROL (Rotate left)
Sintaxis: ROL destino, contador
Descripción: Rotar a la izquierda los bits del operando destino, el número de veces
especificado en el contador. El bit más significativo se desplaza a la
posición menos significativa del operando destino. El bit más
significativo también entra a la bandera C.
Si el número de bits a desplazar es 1, se puede especificar
directamente, pero si el número de bits a desplazar es mayor a 1, su
valor debe cargarse en CL como segundo operando.
Operación: contador = constante
Mientras contador ≠ 0
bit menos significativo = bit más significativo
bandera C = bit más significativo
contador = contador – 1
Banderas: O D I T S Z A P C
c n n n n n n n c
Ejemplo: mov cl, 4
mov al, 01110011b
rol al,cl
Operandos: rol registro 16, 1
rol registro 16, cl
rol memoria 16, 1
rol memoria 16, cl
rol registro 8, 1
rol registro 8, cl
rol memoria 8, 1
rol memoria 8, cl
ROR (Rotate right)
Sintaxis: ROR destino, contador
Descripción: Rotar a la derecha los bits del operando destino, el número de veces
especificado en el contador. El bit menos significativo se desplaza a la
posición más significativa del operando destino. El bit menos
significativo también entra a la bandera C.
Si el número de bits a desplazar es 1, se puede especificar
directamente, pero si el número de bits a desplazar es mayor a 1, su
valor debe cargarse en CL como segundo operando.
Operación: contador = constante
Mientras contador ≠ 0
bit más significativo = bit menos significativo
bandera C = bit menos significativo
contador = contador – 1
42
Banderas: O D I T S Z A P C
c n n n n n n n c
Ejemplo: mov cl, 4
mov al, 01110011b
ror al,cl
Operandos: ror registro 16, 1
ror registro 16, cl
ror memoria 16, 1
ror memoria 16, cl
ror registro 8, 1
ror registro 8, cl
ror memoria 8, 1
ror memoria 8, cl
SAHF (Store AH in flags)
Sintaxis: SAHF
Descripción: Transfiere bits específicos del registro AH a las banderas S, Z, A, P y C.
Operación: 7 6 5 4 3 2 1 0 del registro AH
S Z A P C
Banderas: O D I T S Z A P C
n n n n c c c c C
Ejemplo: sahf
Operandos: No necesita operandos.
SAL (Shift arithmetic left)
SHL (Shift logical left)
Sintaxis: SAL destino, contador
SHL destino, contador
Descripción: Desplaza a la izquierda los bits del operando destino la cantidad de
veces especificada en contador. Los bits de la derecha del operando
destino se rellenan con ceros y los bits que salen de la izquierda del
operador se pierden.
Si el número de bits a desplazar es 1, se puede especificar
directamente, pero si el número de bits a desplazar es mayor a 1, su
valor debe cargarse en CL como segundo operando.
SAL y SHL son físicamente la misma instrucción.
Operación: contador = constante
Mientras contador ≠ 0
bit menos significativo = 0
contador = contador – 1
43
Banderas: O D I T S Z A P C
c n n n c c c c
Ejemplo: mov cl, 4
mov al, 01110011b
sal al,cl
Operandos: sal registro 16, 1
sal registro 16, cl
sal memoria 16, 1
sal memoria 16, cl
sal registro 8, 1
sal registro 8, cl
sal memoria 8, 1
sal memoria 8, cl
SAR (Shift arithmetic right)
Sintaxis: SAR destino, contador
Descripción: Desplaza a la derecha los bits del operando destino la cantidad de
veces especificada en contador. Los bits de la izquierda del operando
destino se rellenan con ceros y los bits que salen de la derecha del
operador se pierden.
Si el número de bits a desplazar es 1, se puede especificar
directamente, pero si el número de bits a desplazar es mayor a 1, su
valor debe cargarse en CL como segundo operando.
Operación: contador = constante
Mientras contador ≠ 0
bit más significativo = 0
contador = contador – 1
Banderas: O D I T S Z A P C
c n n n c c c c
Ejemplo: mov cl, 4
mov al, 01110011b
sar al,cl
Operandos: sar registro 16, 1
sar registro 16, cl
sar memoria 16, 1
sar memoria 16, cl
sar registro 8, 1
sar registro 8, cl
sar memoria 8, 1
sar memoria 8, cl
44
SBB (Subtract with borrow)
Sintaxis: SBB destino, fuente
Descripción: Resta el operando fuente del operando destino. Si la bandera C = 1,
además se resta uno del operando destino. El resultado se deposita en
el operando destino. Los operandos deben ser del mismo tipo.
Operación: destino = destino – fuente
Si C = 1
destino = destino – 1
Banderas: O D I T S Z A P C
c n n n c c c c c
Ejemplo: mov al, 101 ; al = 65h
mov bl, 155 ; bl = 9Bh
add al, bl ; ax = 0000h, C = 1
sbb al, 3 ; ax = FFFCh
Operandos: sbb registro 8, registro 8
sbb registro 16, registro 16
sbb registro 8, memoria 8
sbb registro 16, memoria 16
sbb memoria 8, registro 8
sbb memoria 16, registro 16
sbb registro 8, 30
sbb registro 16, 124h
sbb memoria 8, 25h
sbb memoria 16, 1409h
SCAS (Scan string)
SCASB (Scan string byte)
SCASW (Scan string word)
Sintaxis: SCAS cadena_destino
SCASB
SCASW
Descripción: Busca un byte (en AL) o una palabra (en AX) en la cadena destino,
apuntada por ES:DI. Actualiza DI para que apunte al siguiente elemento
de la cadena a cargar.
Si la bandera D = 0, entonces DI se incremente pero si D = 1, entonces
DI se decrementa (ver las instrucciones STD y CLD).
La instrucción SCASB busca un byte = AL en la cadena apuntada por
ES:[DI] y se actualiza DI en uno.
La instrucción SCASW busca un word = AX en la cadena apuntada por
ES:[DI] y se actualiza DI en dos.
45
El ensamblador utiliza el operando especificado en SCAS solo para
verificar el tipo (byte o word) y para ver si se ha especificado un registro
de segmento.
Estas instrucciones se utilizan con los prefijos REPE(REPZ) o
REPNE(REPNZ).
Operación: Si D = 0, AL – ES:[DI], y SI = SI +1
Si D = 0, AX – ES:[DI], y SI = SI + 2
Si D = 1, AL – ES:[DI], y SI = SI – 1
Si D = 1, AX – ES:[DI], y SI = SI – 2
Banderas: O D I T S Z A P C
c n n n c c c c c
Ejemplo: en el segmento de datos
destino db ' Rien n'est trop beau pour une si belle'
En el segmento de código
push ds
sub ax, ax
push ax
mov ax, datos
mov ds, ax ;
mov es, ax ; Debido a que ES:[DI] = destino,
; hacemos ES = DS
cld
lea di, destino
mov cx, 38
rep movs byte ptr[di], byte ptr[si]
;
; En vez de la última instrucción es mejor utilizar rep movsb para
; buscar byte por byte y es mejor utilizar rep movsw para buscar
; word por word.
Operandos: scas memoria 8
scasb
scas memoria 16
scasw
SHR (Shift logical right)
Sintaxis: SHR destino, contador
Descripción: Desplaza a la derecha los bits del operando destino la cantidad de
veces especificada en contador. Los bits de la izquierda del operando
destino se rellenan con ceros y los bits que salen de la derecha del
operador se pierden.
Si el número de bits a desplazar es 1, se puede especificar
directamente, pero si el número de bits a desplazar es mayor a 1, su
valor debe cargarse en CL como segundo operando.
Funciona exactamente igual que la instrucción SAL
46
Operación: contador = constante
Mientras contador ≠ 0
bit más significativo = 0
contador = contador – 1
Banderas: O D I T S Z A P C
c n n n c c c c
Ejemplo: mov cl, 4
mov al, 01110011b
shr al,cl
Operandos: shr registro 16, 1
shr registro 16, cl
shr memoria 16, 1
shr memoria 16, cl
shr registro 8, 1
shr registro 8, cl
shr memoria 8, 1
shr memoria 8, cl
STC (Set carry flag)
Sintaxis: STC
Descripción: Pone a uno la bandera de acarreo sin afectar a ninguna otra bandera
Operación: C = 1
Banderas: O D I T S Z A P C
n n n n n n n n 1
Ejemplo: stc
Operandos: No necesita operandos.
STD (Set direction flag)
Sintaxis: STD
Descripción: Pone a uno la bandera de dirección sin afectar a ninguna otra bandera
Operación: D = 1
Banderas: O D I T S Z A P C
n 1 n n n n n n n
Ejemplo: std
Operandos: No necesita operandos.
47
STI (Set interrupt flag)
Sintaxis: STI
Descripción: Pone a uno la bandera de interrupciones sin afectar a ninguna otra
bandera
Operación: I = 1
Banderas: O D I T S Z A P C
n n 1 n n n n n n
Ejemplo: sti ; activa las interrupciones enmascarables
Operandos: No necesita operandos.
STOS (Store string)
STOSB (Store string byte)
STOSW (Store string word)
Sintaxis: STOS cadena_destino
STOSB
STOSW
Descripción: Transfiere un byte o un apalabra del acumulador AL o AX a la cadena
destino, apuntada por ES:DI,. Actualiza DI para que apunte al siguiente
elemento de la cadena a almacenar.
Si la bandera D = 0, entonces DI se incremente pero si D = 1, entonces
DI se decrementa (ver las instrucciones STD y CLD).
La instrucción STOSB almacena el registro AL en la dirección ES:[DI] y
se actualiza DI en uno.
La instrucción STOSW almacena el registro AX en la dirección ES:[DI] y
se actualiza DI en dos.
El ensamblador utiliza el operando especificado en STOS solo para
verificar el tipo (byte o word) y para ver si se ha especificado un registro
de segmento.
Operación: Si D = 0 y ES:[DI] = AL y SI = SI +1
Si D = 0 y DS:[SI] = AX y SI = SI + 2
Si D = 1 y DS:[SI] = AL y SI = SI – 1
Si D = 1 y DS:[SI] = AX y SI = SI – 2
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: en el segmento de datos
pantalla db 80*25*2 dup(0)
En el segmento de código
push ds
48
sub ax, ax
push ax
mov ax, datos
mov ds, ax ;
mov ax, 0B800h ; Debido a que ES:[DI] = destino,
mov es, ax ; apuntamos con ES:[DI] a =0B800h
cld
mov al, 20h
lea di, pantalla
rep stos byte ptr [DI]
;
; Como la cadena es tipo byte la última instrucción se puede reemplazar
; por
;
rep stosb
Operandos: stos memoria 8
stosb
stos memoria 16
stosw
SUB (Subtract)
Sintaxis: SUB destino, fuente
Descripción: Resta el operando fuente del operando destino. El resultado se deposita
en el operando destino. Los operandos deben ser del mismo tipo.
Operación: destino = destino – fuente
Banderas: O D I T S Z A P C
c n n n c c c c c
Ejemplo: mov al, 5 ; al = 05h
mov bl, 3 ; bl = 03h
sub al, bl ; ax = 02h
Operandos: sub registro 8, registro 8
sub registro 16, registro 16
sub registro 8, memoria 8
sub registro 16, memoria 16
sub memoria 8, registro 8
sub memoria 16, registro 16
sub registro 8, 30
sub registro 16, 124h
sub memoria 8, 25h
sub memoria 16, 1409h
TEST (Test)
Sintaxis: TEST destino, fuente
Descripción: “Y lógico” a nivel de bits, el resultado no se deposita en el operando
destino. Los operandos deben ser del mismo tipo.
49
Operación: destino “Y lógico” fuente
Banderas: O D I T S Z A P C
0 n n n c c c 0
Ejemplo: mov al, 10000000b
test al, 10000000b
jnz otro
Operandos: test registro 8, registro 8
test registro 16, registro 16
test registro 8, memoria 8
test registro 16, memoria 16
test memoria 8, registro 8
test memoria 16, registro 16
test registro 8, 101b
test registro 16, 124h
test memoria 8, 25h
test memoria 16, 1409h
WAIT (Wait)
Sintaxis: WAIT
Descripción: Pone el procesador en estado de espera. El estado de espera es
abandonado cuando la patita TEST es activada. WAIT chequea la línea
TEST cada cinco intervalos de reloj.
WAIT y TEST se utilizan para comunicar el procesador principal con
otros procesadores.
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: wait
Operandos: No necesita operandos.
XCHG (Exchange)
Sintaxis: XCHG destino, fuente
Descripción: Intercambia el contenido entre los dos operandos, tipo byte o word. No
se pueden utilizar los registros de segmento
Operación: aux = destino
destino = fuente
fuente = aux
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: xchg al, ah
Operandos: xchg registro 8, registro 8
50
xchg registro 8, memoria 8
xchg memoria 8, registro 8
xchg registro 16, registro 16
xchg registro 16, memoria 16
xchg memoria 16, registro 16
xchg registro 8, 13h
xchg registro 16, 1973h
XLAT (Translate)
Sintaxis: XLAT tabla_fuente
Descripción: Saca un byte de una tabla apuntada por BX, utilizando AL como índice
para posicionarse en la dirección requerida.
La tabla tiene que ser tipo byte y debe tener una longitud máxima de
256 bytes
Operación: AL = byte direccionado por (BX + AL)
Banderas: O D I T S Z A P C
n n n n n n n n n
Ejemplo: en el segmento de datos
tabla db 1,3,5,7,9,11
En el segmento de código
lea bx,tabla
mov al, 3
xlat tabla ; al = 7
;
; esto equivale a
;
mov al, tabla[3]
Operandos: xlat memoria 8
XOR (Logical exclusive OR)
Sintaxis: XOR destino, fuente
Descripción: Operación lógica “O” exclusivo a nivel de bits entre los operandos, es
resultado se almacena en el destino. La lógica XOR es:
00 = 0
01 = 1
10 = 1
11 = 0
Operación: destino = destino XOR fuente
C = O = 0
51
Banderas: O D I T S Z A P C
0 n n n c c c 0
Ejemplo: mov al, 0Dh ; al = 00001101 = 0Dh
mov bl, D0h ; bl = 11010000 = D0h
xor al, bl ; al = 11011101 = DDh
Operandos: or registro 8, registro 8
or registro 8, memoria 8
or memoria 8, registro 8
or registro 8, constante
or memoria 8, constante
or registro 16, registro 16
or registro 16, memoria 16
or memoria 16, registro 16
or registro 16, 28h
or memoria 16, 1964h

Más contenido relacionado

Similar a Intrucciones 16 bits.pdf

Equipo 6 comparaciones
Equipo 6 comparacionesEquipo 6 comparaciones
Equipo 6 comparaciones
gabo
 
Organizacion-de-la-unidad-central-de-procesamiento
Organizacion-de-la-unidad-central-de-procesamientoOrganizacion-de-la-unidad-central-de-procesamiento
Organizacion-de-la-unidad-central-de-procesamiento
José Luis Olivares
 
Organizacion de la unidad central de procesamiento
Organizacion de la unidad central de procesamientoOrganizacion de la unidad central de procesamiento
Organizacion de la unidad central de procesamiento
Harold Torres
 
Comandos De Unix
Comandos De UnixComandos De Unix
Comandos De Unix
guestaa40a5
 
Datos Escalares
Datos EscalaresDatos Escalares
Datos Escalares
johanna20
 

Similar a Intrucciones 16 bits.pdf (20)

Equipo 6 comparaciones
Equipo 6 comparacionesEquipo 6 comparaciones
Equipo 6 comparaciones
 
pic-16F628 generalidades y prog 1y2.pdf
pic-16F628 generalidades y prog 1y2.pdfpic-16F628 generalidades y prog 1y2.pdf
pic-16F628 generalidades y prog 1y2.pdf
 
Organizacion-de-la-unidad-central-de-procesamiento
Organizacion-de-la-unidad-central-de-procesamientoOrganizacion-de-la-unidad-central-de-procesamiento
Organizacion-de-la-unidad-central-de-procesamiento
 
Código documentado.docx
Código documentado.docxCódigo documentado.docx
Código documentado.docx
 
Organizacion de la unidad central de procesamiento
Organizacion de la unidad central de procesamientoOrganizacion de la unidad central de procesamiento
Organizacion de la unidad central de procesamiento
 
Técnicas de programación en ensamblador pic16f877a repertorio 35 instrucciones
Técnicas de programación en ensamblador pic16f877a repertorio 35 instrucciones Técnicas de programación en ensamblador pic16f877a repertorio 35 instrucciones
Técnicas de programación en ensamblador pic16f877a repertorio 35 instrucciones
 
Arranque de Sistema Operativo con Assembler
Arranque de Sistema Operativo con AssemblerArranque de Sistema Operativo con Assembler
Arranque de Sistema Operativo con Assembler
 
Lenguajes ensambladores
Lenguajes ensambladoresLenguajes ensambladores
Lenguajes ensambladores
 
Curso Micro Tema 2
Curso Micro Tema 2Curso Micro Tema 2
Curso Micro Tema 2
 
Comandos De Unix
Comandos De UnixComandos De Unix
Comandos De Unix
 
Datos Escalares
Datos EscalaresDatos Escalares
Datos Escalares
 
microprocesadores y microcontroladores
microprocesadores y microcontroladoresmicroprocesadores y microcontroladores
microprocesadores y microcontroladores
 
Curso de microcontroladores capitulo 08
Curso de microcontroladores capitulo 08Curso de microcontroladores capitulo 08
Curso de microcontroladores capitulo 08
 
Apuntes generación de codigo intermedio
Apuntes generación de codigo intermedioApuntes generación de codigo intermedio
Apuntes generación de codigo intermedio
 
assembler
assembler assembler
assembler
 
Debug utilitario dos
Debug utilitario dosDebug utilitario dos
Debug utilitario dos
 
Electrónica digital
Electrónica digitalElectrónica digital
Electrónica digital
 
Lenguaje c
Lenguaje cLenguaje c
Lenguaje c
 
Codificacion
CodificacionCodificacion
Codificacion
 
Arquitectura De Los Computadore
Arquitectura De Los ComputadoreArquitectura De Los Computadore
Arquitectura De Los Computadore
 

Último

tema ilustrado 9 el inicio del reinado de juan carlos I
tema ilustrado 9 el inicio del reinado de juan carlos Itema ilustrado 9 el inicio del reinado de juan carlos I
tema ilustrado 9 el inicio del reinado de juan carlos I
irenecarmona12
 
GRUPO 1.pptx problemas oportunidades objetivos
GRUPO 1.pptx problemas oportunidades objetivosGRUPO 1.pptx problemas oportunidades objetivos
GRUPO 1.pptx problemas oportunidades objetivos
CristianGmez22034
 
PLANTILLA UNAD JJAJJJJJWRBJHGURGERRTERTRTRY
PLANTILLA UNAD JJAJJJJJWRBJHGURGERRTERTRTRYPLANTILLA UNAD JJAJJJJJWRBJHGURGERRTERTRTRY
PLANTILLA UNAD JJAJJJJJWRBJHGURGERRTERTRTRY
karendaza9506
 
secuencias de los figuras de cuadros y rectangulos
secuencias de los figuras de cuadros y rectangulossecuencias de los figuras de cuadros y rectangulos
secuencias de los figuras de cuadros y rectangulos
RosarioLloglla
 
PLAN DE MANTENIMIENTO DE SISTEMAS DE AGUA CHONTAYOC.docx
PLAN DE MANTENIMIENTO DE SISTEMAS DE AGUA CHONTAYOC.docxPLAN DE MANTENIMIENTO DE SISTEMAS DE AGUA CHONTAYOC.docx
PLAN DE MANTENIMIENTO DE SISTEMAS DE AGUA CHONTAYOC.docx
Leo Florez
 

Último (20)

La Bauhaus y la nueva tipografía en el diseño gráfico
La Bauhaus y la nueva tipografía en el diseño gráficoLa Bauhaus y la nueva tipografía en el diseño gráfico
La Bauhaus y la nueva tipografía en el diseño gráfico
 
Arquitectos del Movimiento Moderno Pt. 2.pdf
Arquitectos del Movimiento Moderno Pt. 2.pdfArquitectos del Movimiento Moderno Pt. 2.pdf
Arquitectos del Movimiento Moderno Pt. 2.pdf
 
GROPUIS Y WRIGHT DIPOSITIVA ARQUITECTURA DISEÑO MODERNIDAD
GROPUIS Y WRIGHT DIPOSITIVA ARQUITECTURA DISEÑO MODERNIDADGROPUIS Y WRIGHT DIPOSITIVA ARQUITECTURA DISEÑO MODERNIDAD
GROPUIS Y WRIGHT DIPOSITIVA ARQUITECTURA DISEÑO MODERNIDAD
 
DIAGNOSTICO URBANO DE DE LA ISLA DE COCHE
DIAGNOSTICO URBANO DE DE LA ISLA DE COCHEDIAGNOSTICO URBANO DE DE LA ISLA DE COCHE
DIAGNOSTICO URBANO DE DE LA ISLA DE COCHE
 
Fundamentos de la Ergonomía y sus características principales
Fundamentos de la Ergonomía y sus características principalesFundamentos de la Ergonomía y sus características principales
Fundamentos de la Ergonomía y sus características principales
 
414414508-Diseno-de-Coberturas-Metalicas.pptx
414414508-Diseno-de-Coberturas-Metalicas.pptx414414508-Diseno-de-Coberturas-Metalicas.pptx
414414508-Diseno-de-Coberturas-Metalicas.pptx
 
Apuntes de criterios estrcuturales, calculo de trabes y contratrabes de concr...
Apuntes de criterios estrcuturales, calculo de trabes y contratrabes de concr...Apuntes de criterios estrcuturales, calculo de trabes y contratrabes de concr...
Apuntes de criterios estrcuturales, calculo de trabes y contratrabes de concr...
 
Anexo Nivel 3 Ficha Lectura pptjsbdkks
Anexo  Nivel 3 Ficha  Lectura pptjsbdkksAnexo  Nivel 3 Ficha  Lectura pptjsbdkks
Anexo Nivel 3 Ficha Lectura pptjsbdkks
 
tema ilustrado 9 el inicio del reinado de juan carlos I
tema ilustrado 9 el inicio del reinado de juan carlos Itema ilustrado 9 el inicio del reinado de juan carlos I
tema ilustrado 9 el inicio del reinado de juan carlos I
 
INICIOS DEL MOVIMIENTO MODERNO 1900-1930.pdf
INICIOS DEL MOVIMIENTO MODERNO 1900-1930.pdfINICIOS DEL MOVIMIENTO MODERNO 1900-1930.pdf
INICIOS DEL MOVIMIENTO MODERNO 1900-1930.pdf
 
CATALOGO 2024 DIA DE LA MADRE, presentación.pdf
CATALOGO 2024 DIA DE LA MADRE, presentación.pdfCATALOGO 2024 DIA DE LA MADRE, presentación.pdf
CATALOGO 2024 DIA DE LA MADRE, presentación.pdf
 
CLASE 2 PSICOTERAPIA COGNITIVO CONDUCTUAL.pdf
CLASE 2 PSICOTERAPIA COGNITIVO CONDUCTUAL.pdfCLASE 2 PSICOTERAPIA COGNITIVO CONDUCTUAL.pdf
CLASE 2 PSICOTERAPIA COGNITIVO CONDUCTUAL.pdf
 
GRUPO 1.pptx problemas oportunidades objetivos
GRUPO 1.pptx problemas oportunidades objetivosGRUPO 1.pptx problemas oportunidades objetivos
GRUPO 1.pptx problemas oportunidades objetivos
 
PLANTILLA UNAD JJAJJJJJWRBJHGURGERRTERTRTRY
PLANTILLA UNAD JJAJJJJJWRBJHGURGERRTERTRTRYPLANTILLA UNAD JJAJJJJJWRBJHGURGERRTERTRTRY
PLANTILLA UNAD JJAJJJJJWRBJHGURGERRTERTRTRY
 
POESÍA ERÓTICA DEL SIGLO XVIII - SERIA Y CARNAL
POESÍA ERÓTICA DEL SIGLO XVIII - SERIA Y CARNALPOESÍA ERÓTICA DEL SIGLO XVIII - SERIA Y CARNAL
POESÍA ERÓTICA DEL SIGLO XVIII - SERIA Y CARNAL
 
Triptico de los derechos humanos pe señorees jaja
Triptico de los derechos humanos pe señorees jajaTriptico de los derechos humanos pe señorees jaja
Triptico de los derechos humanos pe señorees jaja
 
secuencias de los figuras de cuadros y rectangulos
secuencias de los figuras de cuadros y rectangulossecuencias de los figuras de cuadros y rectangulos
secuencias de los figuras de cuadros y rectangulos
 
Portafolio Santiago Agudelo Duran 2024 -30
Portafolio Santiago Agudelo Duran 2024 -30Portafolio Santiago Agudelo Duran 2024 -30
Portafolio Santiago Agudelo Duran 2024 -30
 
Torre agbar analisis arquitectonico.....
Torre agbar analisis arquitectonico.....Torre agbar analisis arquitectonico.....
Torre agbar analisis arquitectonico.....
 
PLAN DE MANTENIMIENTO DE SISTEMAS DE AGUA CHONTAYOC.docx
PLAN DE MANTENIMIENTO DE SISTEMAS DE AGUA CHONTAYOC.docxPLAN DE MANTENIMIENTO DE SISTEMAS DE AGUA CHONTAYOC.docx
PLAN DE MANTENIMIENTO DE SISTEMAS DE AGUA CHONTAYOC.docx
 

Intrucciones 16 bits.pdf

  • 1. 1 Instrucciones Para las banderas tomaremos las siguientes convenciones: c(cambia), n(no cambia) O: Bandera de desbordamiento (Overflow Flag) D: Bandera de dirección (Direction Flag) I: Bandera de interrupciones (Interruption Flag) T: Bandera de paso a paso (Trap flag) S: Bandera de signo (Sign Flag) Z: Bandera de cero (Zero Flag) A: Bandera de acarreo auxiliar (Auxiliary carry flag) P: Bandera de Paridad (Parity Flag) C: Bandera de Acarreo (Carry Flag) AAA (Ascii adjust for addition) Sintaxis: AAA Descripción: Corrige el resultado en AL de una suma de los números decimales desempaquetados, convirtiéndolo en un valor decimal desempaquetado. Operación: Si D3 a D0 de AL > 9 ó A = 1 AL = AL + 6 AH = AH + 1 A = 1 C = A Bits D7 a D4 de AL = 0000b Banderas: O D I T S Z A P C n n n c c Ejemplo: mov ax, 0009h ; al = 9, ah = 0 mov bl, 7 ; bl = 7 add al, bl ; ax = 0010h, A = 1 aaa ; ax = 0106h, A = 1 Operandos: No necesita operandos AAD (Ascii adjust for division) Sintaxis: AAD Descripción: Realiza un ajuste del dividendo en AL antes de hacer la división de dos números decimales desempaquetados, para que el resultado de esta división sea un valor decimal desempaquetado. Operación: AH = AH*10 + AL AL = 0 Banderas: O D I T S Z A P C n n n c c c Ejemplo: mov ax, 0206h ; ax = 518 mov bl, 04h ; bl = 4
  • 2. 2 aad ; ax = 001ah div bl ; ax = 0206h Operando: No necesita operandos AAM (Ascii Adjust for Multiply) Sintaxis: AAM Descripción: Convierte AX en un valor decimal desempaquetado después del producto de dos números decimales desempaquetados. Operación: AH = cociente de AL/10 AL = resto de AL/10 Banderas: O D I T S Z A P C n n n c c Ejemplo: mov al, 06h ; al = 6 mov bl, 08h ; bl = 8 mul bl ; ax = 0030h = 48 aam ; ax = 0408h Operandos: No necesita operandos AAS (ASCII Adjust for Subtraction) Sintaxis: AAS Descripción: Convierte AL en un valor decimal desempaquetado después de la resta de dos números decimales desempaquetados. Operación: Si D3 a D0 de AL > 9 ó la bandera A = 1 entonces AL = AL – 6 AH = AH – 1 Banderas: A = 1, C = A D7 a D4 de AL = 0000b Banderas: O D I T S Z A P C n n n c c c Ejemplo: mov al, 08h ; al = 8 mov bl, 06h ; bl = 6 sub al, bl ; ax = 0002h y A = 0 aas ; ax = 0002h mov ah, 31h ; al = 31h mov bl, 39h ; bl = 39h sub al, bl ; ax = 00F8h aas ; ax = FF02h Operando: No necesita operandos
  • 3. 3 ADC (Addition with carry) Sintaxis: ADC destino, fuente Descripción: Suma los operandos destino y fuente mas la bandera de acarreo (C), el resultado se deposita en el operando destino. Los operandos deben ser del mismo tipo. Operación: destino = destino + fuente + C Banderas: O D I T S Z A P C c n n n c c c c c Ejemplo: mov al, 101 ; al = 65h mov bl, 155 ; bl = 9Bh add al, bl ; ax = 0500h, C = 1 adc al, 3 ; ax = 0504h Operandos: adc registro 8, registro 8 adc registro 16, registro 16 adc registro 8, memoria 8 adc registro 16, memoria 16 adc memoria 8, registro 8 adc memoria 16, registro 16 adc registro 8, 30 adc registro 16, 124h adc memoria 8, 25h adc memoria 16, 1409h ADD (Addition) Sintaxis: AAD destino, fuente Descripción: Suma los operandos destino y fuente, el resultado se deposita en el operando destino. Los operandos deben ser del mismo tipo. Operación: AL = AH * 10 + AL AH = 0 Banderas: O D I T S Z A P C c n n n c c c c c Ejemplo: mov al, 101 ; al = 65h mov bl, 155 ; bl = 9Bh add al, bl ; ax = 0500h Tipos de operando: add registro 8, registro 8 add registro 16, registro 16 add registro 8, memoria 8 add registro 16, memoria 16 add memoria 8, registro 8 add memoria 16, registro 16 add registro 8, 30
  • 4. 4 add registro 16, 124h add memoria 8, 25h add memoria 16, 1409h AND (Logical and) Sintaxis: AND destino, fuente Descripción: “Y lógico” a nivel de bits, el resultado se deposita en el operando destino. Los operandos deben ser del mismo tipo. Operación: destino = destino “Y lógico” fuente Banderas: O D I T S Z A P C n n n n c c n n n Ejemplo: mov ax, 3332h ; AH = ASCII de 3, ASCII de 2 and ax, 0F0Fh ; AX = 0302h Operandos: and registro 8, registro 8 and registro 16, registro 16 and registro 8, memoria 8 and registro 16, memoria 16 and memoria 8, registro 8 and memoria 16, registro 16 and registro 8,101b and registro 16, 124h and memoria 8, 25h and memoria 16, 1409h CALL (Call a procedure) Sintaxis: CALL destino Descripción: Bifurca a un procedimiento fuera de línea, salvando previamente en la pila la dirección de la instrucción siguiente, para poder volver a esta instrucción una vez ejecutado el procedimiento Operación: Si la llamada esta dentro del mismo segmento (NEAR) SP = SP - 2 IP actual a la pila IP = desplazamiento de destino Si la llamada está en otro segmento (FAR) SP = SP – 2 CS actual a la pila CS = segmento de destino SP = SP – 2 IP actual a la pila IP = desplazamiento de destino Llamadas: Directa: A etiquetas relativas a CS, no a variables. Si no se especifica nada, se supone NEAR. Si se requiere se puede explicitar FAR
  • 5. 5 Indirecta: A variables, donde se puede especificar WORD PTR o DWORD PTR para llamadas NEAR o FAR, respectivamente. Si se especifica una nueva dirección tipo WORD, el contenido de esa palabra es la nueva dirección (desplazamiento). Si se especifica una nueva dirección tipo DWORD, la primera palabra contiene el segmento y la segunda palabra el desplazamiento También se puede utilizar registros de 16 bits entre corchetes. Para retornar de un procedimiento se utiliza la instrucción RET Banderas: O D I T S Z A P C n n n n n n n n n Ejemplos: call otro ; Llamada directa al procedimiento “otro” call word ptr otro ; Llamada NEAR indirecta call word ptr [bx] call dword ptr otro ; Llamada FAR indirecta call dword ptr [bx] Operandos: call nombre de procedimiento cercano call word ptr memoria 16 call nombre de procedimiento lejano call dword ptr memoria 32 CBW (Convert byte to word) Sintaxis: CBW Descripción: Copia el bit 7 del registro AL en todos los bits del registro AH; es decir, se expande el bit de signo. Operación: Si AL < 80h AH = 00h De otro modo AH = FFh Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: mov al, 80h cbw ; ax = FF80h mov al, 05h cbw ; ax = 0005h Tipos de operando: No necesita operandos
  • 6. 6 CLC (Clear carry flag) Sintaxis: CLC Descripción: Borra la bandera de acarreo sin afectar a ninguna otra bandera. Operación: C = 0 Banderas: O D I T S Z A P C n n n n n n n n 0 Ejemplo: clc ; C = 0 Operandos: No necesita operandos CLD (Clear direction flag) Sintaxis: CLD Descripción: Borra la bandera de dirección, que ocasiona, que en la ejecución de instrucciones de manejo de cadenas de caracteres los registros índice SI y/o DI se autoincrementen de modo automático. Si los operandos son tipo byte se incrementa en 1 Si los operandos son tipo word se incrementa en 2 Operación: D = 0 Banderas: O D I T S Z A P C n 0 n n n n n n n Ejemplo: cld ; D = 0 Operandos: No necesita operandos CLI (Clear interrupt flag) Sintaxis: CLI Descripción: Borra la bandera de interrupciones sin afectar a ninguna otra bandera. Cuando I = 0 el microprocesador no acepta interrupciones enmascarables. Operación: I = 0 Banderas: O D I T S Z A P C n n 0 n n n n n n Ejemplo: cli ; I = 0 Operandos: No necesita operandos
  • 7. 7 CMC (Complement carry flag) Sintaxis: CMC Descripción: Complementa la bandera de acarreo. Operación: Si C = 0, entonces C = 1 Si C = 1, entonces C = 0 Banderas: O D I T S Z A P C n n n n n n n n x Ejemplo: cmc ; Complementa C Operando: No necesita operandos CMP (Compare two operands) Sintaxis: CMP destino, fuente Descripción: Resta fuente de destino, pero no retorna resultado. Los operandos no se alteran, pero las banderas se actualizan y pueden utilizarse en instrucciones de bifurcación condicional. Los operandos pueden ser tipo byte o tipo word, pero ambos del mismo tipo. Operación: destino - fuente Banderas: O D I T S Z A P C c n n n c c c c c Ejemplo: cmp ax, bx ; Compara AX con BX Operandos: cmp registro 8, registro 8 cmp registro 16, registro 16 cmp registro 8, memoria 8 cmp registro 16, registro 16 cmp memoria 8, registro 8 cmp memoria 16, registro 16 cmp registro 8, numero cmp registro 16, numero cmp memoria 8, numero cmp memoria 16, numero CMPS (Compare string) CMPSB (Compare string byte) CMPSW (Compare string word) Sintaxis: CMPS/CMPSB/CMPSW cadena_destino, cadena_fuente Descripción: Compara dos zonas de memoria (tipo byte o tipo word) realizando la operación cadena_fuente – cadena_destino. Esta operación afecta las banderas pero no se guarda el resultado. La cadena fuente esta direccionada por SI y la cadena destino por DI en el segmento de datos, realizándose por tanto la operación DS:[SI] – DS:[DI].
  • 8. 8 Los registros SI y DI se actualizan en 1 si las cadenas son tipo byte y en 2 si las cadenas son tipo word. Si la bandera de dirección D = 0, los registros SI y DI se incrementan (ver instrucción CLD) Si la bandera de dirección D = 1, los registros SI y DI se decrementan (ver instrucción STD). En la instrucción CMPSB se realiza la resta entre bytes: DS:[SI] – DS: [DI]. En la instrucción CMPSW se realiza la resta entre words: DS:[SI] – DS: [DI]. Importante. Si se especifican operandos en la instrucción CMPS, solo se utilizan para verificar el tipo (byte o word) y ver si se ha especificado un registro de segmento. Es decir CMPS en realidad no utiliza sus operandos para realizar la operación DS:[SI] – DS:[DI]. Delante de las instrucciones CMPS, CMPSB y CMPSW se pueden utilizar los prefijos REPE (REPZ) o REPNE (REPNZ) o REP, para comparar dos cadenas completas. En este caso el número de elementos a comparar esta en el registro CX. En CMPS se puede reasignar el elemento fuente, pero no el destino; por ejemplo CMPS destino, ES:fuente. Importante. En CMPS la operación es fuente – destino al contrario que en CMP cuya operación es destino – fuente. Esto hay que tener en cuenta para la bifurcación después de la comparación. Operación: cadena_fuente – cadena_destino Banderas: O D I T S Z A P C c n n n c c c c c Ejemplo: lea si, origen lea di, destino cmp [di], [si] jl otro cld ; para incrementar SI y DI mov si, offset origen mov di, offset destino mov cx, 20 repe cmps [DI], [SI] ; compara los elementos ; si los datos son tipo byte se puede ; reemplazar por repe cmpsb je otro cld ; para incrementar SI y DI push ds ; ES = DS pop es mov si, offset origen mov di, offset destino
  • 9. 9 mov cx, 20 repe cmps [DI], [SI] ; compara los elementos ; si los datos son tipo Word se puede ; reemplazar por repe cmpsw je otro Operandos: CMPS byte_destino,byte_fuente CMPSB CMPS Word_destino_byte_fuente CMPSW CWD (Convert word to doubleword) Sintaxis: CWD Descripción: Copia el bit 15 del registro AX en todos los bits del registro DX; es decir, se expande el bit de signo. Operación: Si AX < 8000h DX = 0000h De otro modo DX = FFFFh Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: mov ax, C280h cwd ; dx = FFFFh mov ax, 0500h cbw ; dx = 0000h Operandos: No necesita operandos DAA (Decimal adjust for addition) Sintaxis: DAA Descripción: Corrige el resultado de AL después de la suma de dos números decimales empaquetados. El resultado en AL es un número decimal empaquetado. Operación: Si D3 a D0 de AL > 9 o A = 1 AL = AL + 6 y A = 1 Si AL > 9Fh o C = 1 AL = AL + 60h y C = 1 Banderas: O D I T S Z A P C n n n c c c c c Ejemplo: mov al, 64h ; ax = 0064h mov bl, 73h add al, bl ; ax = 00D7h daa ; ax = 0037h y C = 1
  • 10. 10 mov al, 13h mov bl, 28h add al, bl ; ax = 003Bh daa ; ax = 0041h y A = 1 Operandos: No necesita operandos DAS (Decimal adjust for addition) Sintaxis: DAS Descripción: Corrige el resultado en AL después de la resta de dos números decimales empaquetados. El resultado en AL es un número decimal empaquetado. Operación: Si D3 a D0 de AL > 9 o A = 1 AL = AL - 6 y A = 1 Si AL > 9Fh o C = 1 AL = AL - 60h y C = 1 Banderas: O D I T S Z A P C n n n n c c c c c Ejemplo: mov al,73h ; ax = 0073h mov bl,28h sub al,bl ; ax = 004Bh das ; ax = 0045h Operandos: No necesita operandos DEC (Decrement destination by one) Sintaxis: DEC destino Descripción: Resta en uno el operando destino. El operando puede ser byte o word. Operación: destino = destino - 1 Banderas: O D I T S Z A P C c n n n c c c c n Ejemplo: mov cx, 1964h dec cx ; cx = 1963 Operandos: dec registro 8 dec registro 16 dec memoria 8 dec memoria 16 DIV (Division, unsigned) Sintaxis: DIV fuente Descripción: Divide, sin tomar en cuenta el signo, AX entre fuente (byte). El cociente se guarda en AL y el resto en AH.
  • 11. 11 Divide, sin tomar en cuenta el signo, DX:AX entre fuente (word). El cociente se guarda en AX y el resto en DX. Si el cociente es mayor que el valor máximo que se puede almacenar en AL = FFh ó AX = FFFFh, se produce una interrupción tipo cero. Si C = 1 y O = 1, significa que los datos en AH o en DX son parte del resultado, contienen el resto. Operación: Si AX / fuente byte AL = cociente; si AL > FFh se genera int 0 AH = resto Si DX:AX / fuente word AX = cociente; si AX = FFFFh segenera int 0 DX = resto Banderas: O D I T S Z A P C n n n Ejemplo: mov ax,0013h mov bl,2 div bl ; AH = 03 (resto), AL = 06 (cociente) mov dx,0 mov ax,0013h mov bx,0002 div bx ; DX = 0003 (resto), AX = 0006 (cociente) Operandos: div registro 8 div registro 16 div memoria 8 div memoria 16 ESC (Escape) Sintaxis: ESC código de operación externo,fuente Descripción: Se utiliza para permitir la comunicación con otros procesadores. ESC se utiliza en combinación con WAIT. Con la instrucción WAIT se detiene el 8086/8088 hasta que el otro procesador acabe lo que está haciendo. Normalmente WAIT se sitúa delante de ESC, para asegurar que el código de operación sea recogido por el otro procesador. El primer operando es un valor inmediato entre 0 y 3Fh y sirve para denotar al otro procesador y la operación que debe realizar este. El segundo operando puede ser un registro o un aposición de memoria donde se especifica el dato a pasar al otro procesador. Si el segundo operando es un registro el 8086/8088 no hace nada. Si el segundo operando es una dirección de memoria, el 8080/8088 envía el contenido apuntado por esa dirección al bus de datos, este dato es ignorado por el 8086/8088, pero puede ser capturado por el otro procesador.
  • 12. 12 Operación: Si fuente es un registro Ninguna operación Si fuente es una dirección de memoria Bus de datos = contenido de fuente Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: wait ; Espera a que el otro procesador ; acabe con la operación en curso esc 21,variable ; Bus de datos = contenido de VARIABLE ; pasa información al otro coprocesador Operandos: esc 21, registro 8 esc 21, registro 16 esc 21, memoria 8 HLT (Halt) Sintaxis: HLT Descripción: El 8086/8088 se detiene y abandona este estado en uno de los siguientes casos: 1. Se reinicializa el sistema (RESET) 2. Se recibe una interrupción NMI 3. Se recibe una interrupción INTR (si I = 1) Operación: destino = destino - 1 Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: hlt ; se detiene el procesador Operandos: No necesita operandos IDIV (Integer division, signed) Sintaxis: IDIV fuente Descripción: Divide, tomando en cuenta el signo, AX entre fuente (byte). El cociente se guarda en AL y el resto en AH. Divide, tomando en cuenta el signo, DX:AX entre fuente (word). El cociente se guarda en AX y el resto en DX. Si el cociente es positivo y mayor que el valor máximo que se puede almacenar en AL = 7Fh = 127 ó AX = 7FFFh = 32767 ó si el cociente es negativo e inferior que el valor mínimo que se puede almacenar en AL = 81h = -127 ó AX = 8001h = -32767, se produce una interrupción tipo cero. Si C = 1 y O = 1, significa que los datos en AH o en DX son parte del resultado, contienen el resto.
  • 13. 13 Operación: Si AX / fuente byte AL = cociente; si AL > 7Fh ó AL < 81h se genera int 0 AH = resto Si DX:AX / fuente word AX = cociente; si AX = 7FFFh ó AX < 8001h se genera int 0 DX = resto Banderas: O D I T S Z A P C n n n Ejemplo: mov ax, -13h ; AX = FFF3h mov bl, 2 idiv bl ; AH = FFh = -01 (resto) ; AL = FAh = -06 (cociente) mov ax, -13h ; AX = FFFAh cwd ; DX = FFFFh y AX = FFFAh mov bx, 0002 idiv bx ; DX = FFFFh = -0001(resto) ; AX = FFFAh = -0006 (cociente) Operandos: idiv registro 8 idiv registro 16 idiv memoria 8 idiv memoria 16 IMUL (Integer multiply, signed) Sintaxis: IMUL fuente Descripción: Multiplica, tomando en cuenta el signo, AL por fuente (byte). El producto se guarda en AX. Multiplica, tomando en cuenta el signo, AX por fuente (word). El producto se guarda en DX:AX. Si C = 1 y O = 1, significa que los datos en AH o en DX son parte del resultado, no representan el signo. Operación: Si fuente byte AX = AL * fuente Si fuente word DX:AX = AX * fuente Si la mitad superior del resultado es la expansión del signo de la mitad Inferior del resultado, entonces C = 0, caso contrario C = 1 y C = O Banderas: O D I T S Z A P C c n n n c Ejemplo: mov al,-13h ; AL = FFF3h mov bl, 2 imul bl ; AX = FFE6h = -26 mov ax, -13h ; AX = FFF3h mov bx, 0002
  • 14. 14 imul bx ; DX:AX = FFFF:FFE6 = -26 ; C = 0 y O = 0 mov ax, -1964h ; AX = F854h mov bx, 1973 ; BX = 07B5h imul bx ; DX:AX = FFC4:DF64 = -3874972 ; C = 1 y O = 1 Operandos: imul registro 8 imul registro 16 imul memoria 8 imul memoria 16 IN (Input byte o word) Sintaxis: IN acumulador, puerta Descripción: Transfiere un byte o una palabra de una puerta de entrada del procesador al registro AL o AX. La puerta puede ser un valor entre 0 y 255, por ejemplo IN al,31h La puerta pueda ser un valor entre 0 y 65535, por ejemplo IN al,dx Operación: Si acumulador = AL AL = dato de la puerta Si acumulador = AX AX = dato de la puerta Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: in al, 31h mov dx, 03f8h in al, dx Operandos: in al, valor entre 0 y 255 in ax, valor entre 0 y 255 in al, dx in ax, dx INC (Increment destination by one) Sintaxis: INC destino Descripción: Suma en uno el operando destino. El operando puede ser byte o word. Operación: destino = destino + 1 Banderas: O D I T S Z A P C c n n n c c c c n Ejemplo: mov cx, 1964h inc cx ; cx = 1965
  • 15. 15 Operandos: inc registro 8 inc registro 16 inc memoria 8 inc memoria 16 INT (Interrupt) Sintaxis: INT tipo_interrupción Descripción: INT activa la interrupción especificada por operando. La dirección del vector de interrupción se calcula multiplicando el operando (entre 0 y 255) por cuatro. El vector de interrupción se compone de: IP = primera palabra y CS = segunda palabra. Antes de atender la interrupción, se guarda en la pila: el registro de banderas y la dirección de retorno (CS, IP) Para retornar de una interrupción se utiliza IRET. Operación: SP = SP – 2 Banderas a la pila I = 0 y T = 0 SP = SP – 2 CS a la pila CS = tipo_interrupción*4 + 2 SP = SP – 2 IP a la pila IP = tipo de interrupción*4 Banderas: O D I T S Z A P C n n c c n n n n n Ejemplo: mov ah, 02 mov dx, 1010h int 10h Operandos: int INTO (Interrupt if overflow) Sintaxis: INTO Descripción: Genera una interrupción tipo 4 si existe desbordamiento, es decir, si O = 1, de otro modo se continua con la ejecución de las instrucciones siguientes, sin ejecutar el procedimiento de interrupción. Operación: Si O = 1 SP = SP - 2 Banderas a la pila I = 0 y T = 0 SP = SP – 2 CS a la pila
  • 16. 16 CS = tipo_interrupción_4*4 + 2 SP = SP – 2 IP a la pila IP = tipo_interrupción_4*4 Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: into Operandos: No necesita operandos IRET (Interrupt return) Sintaxis: IRET Descripción: Devuelve el control a la dirección de retorno salvada en la pila por una operación de interrupción previa y restaura las banderas. IRET se utiliza para finalizar un procedimiento de interrupción. Operación: Recupera IP de la pila SP = SP + 2 Recupera CS de la pila SP = SP + 2 Recupera banderas de la pila Banderas: O D I T S Z A P C c c c c c c c c c Ejemplo: iret Operandos: No necesita operandos JA/JNBE (Jump if above/Jump if not below nor equal) Sintaxis: JA Desplazamiento JNBE Desplazamiento Descripción: Si C = 0 y Z = 0 Transfiere el control a la instrucción (IP + desplazamiento) Si C = 1 o Z = 1 No se transfiere el control El desplazamiento debe estar comprendido entre -128 y 127 bytes. Above (por encima de) y Below (por debajo) se refiere a la relación entre dos valores sin signo. Greater (mayor que) y Less (menor que) se refiere a la relación entre dos valores con signo. Operación: Si C = 0 y Z = 0 IP = IP + desplazamiento
  • 17. 17 (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: cmp ax,20 ; compara AX con 20 ja otro ; si AX > 20, salta sin considerar el signo Operandos: ja otro jnbe otro JAE/JNB (Jump if above or equal/Jump if not below) Sintaxis: JAE Desplazamiento JNB Desplazamiento Descripción: Si C = 0, transfiere el control a la instrucción (IP + desplazamiento) Si C = 1, no se transfiere el control. El desplazamiento debe estar comprendido entre -128 y 127 bytes. Above (por encima de) y Below (por debajo) se refiere a la relación entre dos valores sin signo. Greater (mayor que) y Less (menor que) se refiere a la relación entre dos valores con signo. Operación: Si C = 0 y Z = 0 IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: cmp ax, 20 ; Compara AX con 20 jae otro ; Si AX = 20, salta sin considerar el signo Operandos: jae otro jne otro JB/JNAE/JC (Jump if below/Jump if not above or equal/Jump If carry) Sintaxis: JB Desplazamiento JNAE Desplazamiento JC Desplazamiento Descripción: Si C = 1,transfiere el control a la instrucción (IP + desplazamiento) Si C = 0, no se transfiere el control El desplazamiento debe estar comprendido entre -128 y 127 bytes. Above (por encima de) y Below (por debajo) se refiere a la relación entre dos valores sin signo.
  • 18. 18 Greater (mayor que) y Less (menor que) se refiere a la relación entre dos valores con signo. Operación: Si C = 1, IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n N n n Ejemplo: cmp ax, 20 ; Compara AX con 20 jb otro ; Si AX < 20 salta sin considerar el signo Operandos: jb otro jnae otro jc otro JBE/JNA (Jump if below or equal/Jump if not above) Sintaxis: JBE Desplazamiento JNA Desplazamiento Descripción: Si C = 1 o Z = 1, transfiere el control a la instrucción (IP + desplazamiento) Si C = 0 y Z = 0, no se transfiere el control El desplazamiento debe estar comprendido entre -128 y 127 bytes. Above (por encima de) y Below (por debajo) se refiere a la relación entre dos valores sin signo. Greater (mayor que) y Less (menor que) se refiere a la relación entre dos valores con signo. Operación: Si C = 1 o Z = 1, IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n N n n Ejemplo: cmp ax, 20 ; Compara AX con 20 jbe otro ; Si AX = 20 salta sin considerar el signo Operandos: jbe otro jna otro JCXZ (Jump if CX is zero) Sintaxis: JCXZ Desplazamiento Descripción: Si CX = 0, transfiere el control a la instrucción (IP + desplazamiento) Si CX ≠ 0, no se transfiere el control El desplazamiento debe estar comprendido entre -128 y 127 bytes.
  • 19. 19 Esta instrucción se puede utilizar al inicio de un bucle para no ejecutarlo en caso de que CX = 0. Operación: Si CX = 0, IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n N n n Ejemplo: dec cx ; jcxz otro ; Si CX = 0 salta a otro Operandos: jcxz otro JE/JZ (Jump if equal/Jump if zero) Sintaxis: JE Desplazamiento JZ Desplazamiento Descripción: Si Z = 1, transfiere el control a la instrucción (IP + desplazamiento) Si Z = 0, no se transfiere el control El desplazamiento debe estar comprendido entre -128 y 127 bytes. Operación: Si Z = 1, IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n N n n Ejemplo: cmp ax, 20 ; Compara AX con 20 je etiqueta ; Si AX = 20 salta a etiqueta sub cx,ax jz otro ; Si CX = 0 salta a otro Operandos: je otro jz otro JG/JNLE (Jump if greater/Jump if not less nor equal) Sintaxis: JG Desplazamiento JNLE Desplazamiento Descripción: Si Z = 0 y S = O, transfiere el control a la instrucción (IP + desplazamiento) Si Z = 1 y S ? O, no se transfiere el control El desplazamiento debe estar comprendido entre -128 y 127 bytes. Above (por encima de) y Below (por debajo) se refiere a la relación entre dos valores sin signo. Greater (mayor que) y Less (menor que) se refiere a la relación entre dos valores con signo.
  • 20. 20 Operación: Si Z = 0 y S = O, IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n N n n Ejemplo: cmp ax, 20 ; Compara AX con 20 jg otro ; Si AX > 20 salta considerando el signo Operandos: jg otro jnle otro JGE/JNL (Jump if greater equal/Jump if not less) Sintaxis: JGE Desplazamiento JNL Desplazamiento Descripción: Si S = O, transfiere el control a la instrucción (IP + desplazamiento) El desplazamiento debe estar comprendido entre -128 y 127 bytes. Above (por encima de) y Below (por debajo) se refiere a la relación entre dos valores sin signo. Greater (mayor que) y Less (menor que) se refiere a la relación entre dos valores con signo. Operación: Si S = O, IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n N n n Ejemplo: cmp ax, 20 ; Compara AX con 20 jge otro ; Si AX = 20 salta considerando el signo Operandos: jge otro jnl otro JL/JNGE (Jump if less/Jump if not greater nor equal) Sintaxis: JG Desplazamiento JNLE Desplazamiento Descripción: Si Z = 0 y S = O, transfiere el control a la instrucción (IP + desplazamiento) Si Z = 1 y S ≠ O, no se transfiere el control El desplazamiento debe estar comprendido entre -128 y 127 bytes. Above (por encima de) y Below (por debajo) se refiere a la relación entre dos valores sin signo.
  • 21. 21 Greater (mayor que) y Less (menor que) se refiere a la relación entre dos valores con signo. Operación: Si Z = 0 y S = O, IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n N n n Ejemplo: cmp ax, 20 ; Compara AX con 20 jl otro ; Si AX < 20 salta considerando el signo Operandos: jl otro jnge otro JLE/JNG (Jump if less or equal/Jump if not greater) Sintaxis: JLE Desplazamiento JNG Desplazamiento Descripción: Si Z = 1 o S ≠ O, transfiere el control a la instrucción (IP +desplazamiento) Si Z = 0 y S = O, no se transfiere el control El desplazamiento debe estar comprendido entre -128 y 127 bytes. Above (por encima de) y Below (por debajo) se refiere a la relación entre dos valores sin signo. Greater (mayor que) y Less (menor que) se refiere a la relación entre dos valores con signo. Operación: Si Z = 1 o S ≠ O, IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: cmp ax, 20 ; Compara AX con 20 jle otro ; Si AX = 20 salta considerando el signo Operandos: jle otro jng otro JMP (Jump) Sintaxis: JMP dirección Descripción: Transfiere el control incondicionalmente La transferencia del control puede ser:  Dentro del mismo segmento. Es decir se reemplaza IP por la dirección especificada en el operando. Este desplazamiento puede estar:
  • 22. 22 o Entre -128 y 127 bytes, generándose una instrucción de dos bytes Inferior a -128 o superior a 127 bytes, pudiendo ser el desplazamiento o hasta de 32k bytes. En este saso se genera una instrucción de tres bytes.  Distinto segmento. Es decir: CS e IP se sustituyen por los valores de la dirección especificada en el operando.  La transferencia del control también puede ser: o Directa, es decir especificando una etiqueta o Indirecta, es decir especificando una dirección. Operación: Si la transferencia del control es a distinto segmento CS = segmento IP = desplazamiento Si la transferencia del control es dentro del mismo segmento IP = desplazamiento con signo Banderas: O D I T S Z A P C n n n n n n N n n Ejemplo: jmp otro ; Salta a otro jmp far ptr otro ; Salta (directo) a otro segmento jmp [bx] ; Salta (indirecto) dentro el mismo segmento jmp far ptr [bx] ; Salta (indirecto) a otro segmento otro dw proc01 ; Desplazamiento de proc01, definido en DS jmp otro ; Salta a otro (indirecto) dentro ; del mismo segmento otro dd proc01 ; Desplazamiento de proc01, definido en DS jmp otro ; Salta a otro (indirecto) a otro segmento Operandos: jmp etiqueta jmp short etiqueta jmp etiqueta[DI] jmp far ptr etiqueta jmp far ptr etiqueta[DI] JNC (Jump if not carry) Sintaxis: JNC Desplazamiento Descripción: Si C = 0, transfiere el control a la instrucción (IP + desplazamiento) Si C = 1, no se transfiere el control El desplazamiento debe estar comprendido entre -128 y 127 bytes. Operación: Si C = 0, IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n n n n
  • 23. 23 Ejemplo: add al,bl jnc otro ; Si C = 0, salta a otro Operandos: jnc otro JNE/JNZ (Jump if not equal/Jump if not zero) Sintaxis: JNE Desplazamiento JNZ Desplazamiento Descripción: Si Z = 0, transfiere el control a la instrucción (IP + desplazamiento) Si Z = 1, no se transfiere el control El desplazamiento debe estar comprendido entre -128 y 127 bytes. Above (por encima de) y Below (por debajo) se refiere a la relación entre dos valores sin signo. Greater (mayor que) y Less (menor que) se refiere a la relación entre dos valores con signo. Operación: Si Z = 0, IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: cmp ax,20 ; Compara AX con 20 jne otro ; Si AX ≠ 20 salta a otro sub al,bl jnz otro ; Si AL ≠ 0 salta a otro Operandos: jne otro jnz otro JNO (Jump if not overflow) Sintaxis: JNO Desplazamiento Descripción: Si O = 0, transfiere el control a la instrucción (IP + desplazamiento) Si O = 1, no se transfiere el control El desplazamiento debe estar comprendido entre -128 y 127 bytes. Operación: Si O = 0, IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n n n n
  • 24. 24 Ejemplo: add ax,20 jno otro ; Si O = 0, salta a otro Operandos: jno otro JNP/JPO (Jump if not parity/Jump if parity odd) Sintaxis: JNP Desplazamiento JPO Desplazamiento Descripción: Si P = 0, transfiere el control a la instrucción (IP + desplazamiento) Si P = 1, no se transfiere el control El desplazamiento debe estar comprendido entre -128 y 127 bytes. Operación: Si P = 0, IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: add ax, 20 jnp otro ; Si P = 0, salta a otro Operandos: jnp otro jpo otro JNS(Jump if not sign) Sintaxis: JNS Desplazamiento Descripción: Si S = 0, transfiere el control a la instrucción (IP + desplazamiento) Si S = 1, no se transfiere el control El desplazamiento debe estar comprendido entre -128 y 127 bytes. Operación: Si S = 0, IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: sub ax, 20 ; Compara AX con 20 jns otro ; Si AX = 20 salta a otro Operandos: jns otro JO (Jump if overflow) Sintaxis: JO Desplazamiento Descripción: Si O = 1, transfiere el control a la instrucción (IP + desplazamiento) Si O = 0, no se transfiere el control El desplazamiento debe estar comprendido entre -128 y 127 bytes.
  • 25. 25 Operación: Si O = 1, IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: add ax, 20 jle otro ; Si O = 1, salta a otro Operandos: jo otro JP/JPE (Jump on parity/Jump if parity even) Sintaxis: JP Desplazamiento JPE Desplazamiento Descripción: Si P = 1, transfiere el control a la instrucción (IP + desplazamiento) Si P = 0, no se transfiere el control El desplazamiento debe estar comprendido entre -128 y 127 bytes. Operación: Si P = 1, IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: add ax, 20 jp otro ; Si P = 1, salta a otro Operandos: jp otro jpe otro JS (Jump on sign) Sintaxis: JS Desplazamiento Descripción: Si S = 1, transfiere el control a la instrucción (IP + desplazamiento) Si S = 0, no se transfiere el control El desplazamiento debe estar comprendido entre -128 y 127 bytes. Operación: Si S = 1, IP = IP + desplazamiento (el signo del desplazamiento se extiende a 16 bits) Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: sub ax, 20 js otro ; Si AX < 0 salta a otro Operandos: js otro
  • 26. 26 LAHF (Load register AH from flags) Sintaxis: LAHF Descripción: Copia las banderas S, Z, A, P y C en los bits 7, 6, 4, 2 y 0 respectivamente. Los bits 5, 3, y 1 quedan indefinidos. Operación: AH = S Z x A x P x C Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: lahf Operandos: No necesita operandos. LDS (Load data segment register) Sintaxis: LDS destino,fuente Descripción: Transfiere un puntero de 32 bits a DS:destino(desplazamiento), desde la dirección apuntada por fuente. El operador fuente tiene que estar apuntando a una zona de memoria tipo DD. Operador destino = desplazamiento (palabra inferior) DS = segmento (palabra superior) Operación: DS = palabra apuntada por (fuente + 2) destino = fuente Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: en el segmento de datos Puntero dd 12345678h ; En DS:0000 78 56 34 12 .. .. En el segmento de código lds si, Puntero ; DS = 1234h ; SI = 5678h lea si, Puntero ; SI = 0 lds bx, [si] ; DS = 1234h ; BX = 5678h Operandos: lds si, dirección de memoria lds di, dirección de memoria lds bx, dirección de memoria
  • 27. 27 LEA (Load effective address) Sintaxis: LEA destino,fuente Descripción: Transfiere el desplazamiento del operando fuente al operando destino. La fuente tiene que ser una dirección de memoria y el destino tiene que ser un registro de 16 bits que no sea registro de segmento. LEA permite especificar registros índice en el operando fuente, lo que no es posible con el operador OFFSET. Operación: destino = desplazamiento de fuente. Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: en el segmento de datos hola db “hola” ; DS:0000 68 6F 6C 61 db “cuate” ; DS:0003 63 75 61 74 65 En el segmento de código mov si, 4 lea bx, hola[si] ; BX = 0004 Operandos: lea si, dirección de memoria lea di, dirección de memoria lea bx, dirección de memoria LES (Load extra segment register) Sintaxis: LES destino, fuente Descripción: Transfiere un puntero de 32 bits a ES:destino(desplazamiento), desde la dirección apuntada por fuente. El operador fuente tiene que estar apuntando a una zona de memoria tipo DD. Operador destino = desplazamiento (palabra inferior) ES = segmento (palabra superior) Operación: ES = palabra apuntada por (fuente + 2) destino = fuente Banderas: O D I T S Z A P C n n n n N n n n n Ejemplo: en el segmento de datos Puntero dd 12345678h ; En DS:0000 78 56 34 12 .. .. En el segmento de código les si, Puntero ; ES = 1234h ; SI = 5678h lea si, Puntero ; SI = 0 les bx, [si] ; ES = 1234h ; BX = 5678h
  • 28. 28 Operandos: les si, dirección de memoria les di, dirección de memoria les bx, dirección de memoria LOCK (Lock the bus) Sintaxis: LOCK Descripción: LOCK es un prefijo de un byte que acompaña a una instrucción y que activa la señal mientras dicha instrucción se ejecuta, es decir impide que otros procesadores utilicen el bus. Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: en el segmento de datos semaforo db 0 En el segmento de código check: mov al, 1 lock xchg semaforo, al ; semáforo = 1 (rojo) cmp al, 1 ; ¿semáforo = rojo? je check ; si semáforo esta rojo sigue ; bloqueando el bus ; sino continua con el proceso ; ; Proceso cualquiera ; ; Después de realizar el proceso, poner el ; semáforo en verde (valor 0) ; para permitir que otros procesadores ; accedan al bus ; mov semaforo,0 ; libera el bus Operandos: lock instrucion LODS (Load string) LODSB (Load string byte) LODSW (Load string word) Sintaxis: LODS destino,fuente LODSB LODSW Descripción: Transfiere un byte o un apalabra de la cadena fuente, apuntada por DS:SI, al acumulador AL o AX. Actualiza SI para que apunte al siguiente elemento de la cadena a cargar. Si la bandera D = 0, entonces SI se incremente pero si D = 1, entonces SI se decrementa (ver las instrucciones STD y CLD). La instrucción LODSB carga el registro AL con el dato apuntado por DS: [SI] y se actualiza SI en uno.
  • 29. 29 La instrucción LODSW carga el registro AX con el dato apuntado por DS:[SI] y se actualiza SI en dos. El ensamblador utiliza el operando especificado en LODS solo para verificar el tipo (byte o word) y para ver si se ha especificado un registro de segmento. Operación: Si D = 0 y DS:[SI] = fuente tipo byte, entonces AL = fuente y SI = SI +1 Si D = 0 y DS:[SI] = fuente tipo word, entonces AX = fuente y SI = SI + 2 Si D = 1 y DS:[SI] = fuente tipo byte, entonces AL = fuente y SI = SI – 1 Si D = 1 y DS:[SI] = fuente tipo word, entonces AX = fuente y SI = SI - 2 Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo1: en el segmento de datos datos db ‘La verdad’ En el segmento de código cld lea si,datos lods datos ; ; Como la cadena es tipo byte la última instrucción se puede reemplazar ; por ; lodsb Ejemplo2: en el segmento de datos datos dw ‘La verdad’ En el segmento de código cld lea si,datos lods datos ; ; Como la cadena es tipo word la última instrucción se puede ; reemplazar ; por ; lodsw Operandos: lods memoria 8 lodsb lods memoria 16 lodsw LOOP (Loop) Sintaxis: LOOP desplazamiento Descripción: Decrementa CX Si CX ≠ 0, entonces IP = IP + desplazamiento Si CX = 0, entonces se ejecuta la siguiente instrucción.
  • 30. 30 El desplazamiento debe estar comprendido entre -128 y 127 bytes. Operación: CX = CX - 1 Si CX ≠ 0, entonces IP = IP + desplazamiento Si CX = 0, entonces se ejecuta la siguiente instrucción. Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo1: mov cx,10 … otro: … loop otro Operandos: loop etiqueta LOOPNE (Loop if not equal) LOOPNZ (loop if not zero) Sintaxis: LOOPNE desplazamiento LOOPNZ desplazamiento Descripción: Decrementa el registro CX. Si Z = 0 y CX ≠ 0, entonces IP = IP + desplazamiento Si Z = 1 y CX = 0, entonces se ejecuta la siguiente instrucción. El desplazamiento debe estar comprendido entre -128 y 127 bytes. Operación: CX = CX - 1 Si Z = 0 y CX ≠ 0, entonces IP = IP + desplazamiento Si Z = 1 y CX = 0, entonces se ejecuta la siguiente instrucción. Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo1: mov cx, 10 … otro: … loopne otro Operandos: loopne etiqueta MOV (Move) Sintaxis: mov destino, fuente Descripción: Mueve un byte o un word desde el operando fuente al operando destino. Ambos operandos tienen que ser del mismo tipo. No se puede mover un valor inmediato a un registro de segmento
  • 31. 31 No se puede mover datos entre elementos de memoria, hay que utilizar un registro intermedio. No se puede utilizar CS como destino Operación: destino = fuente. Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo1: mov cx, 10 Operandos: mov memoria 8, registro 8 mov memoria 16, registro 16 mov registro 8, memoria 8 mov registro 16, memoria 16 mov ds, memoria 16 mov ds, ax mov memoria 16, ds mov ax, ds mov es, memoria 16 mov es, ax mov memoria 16, es mov ax, es mov al, 28h mov ax, 1964h mov memoria 8, 13h mov memoria 16, 1973h MOVS (Move string) MOVSB (Move string byte) MOVSW (Move string word) Sintaxis: MOVS cadena_destino,cadena_fuente MOVSB MOVSW Descripción: Transfiere un byte o un apalabra de la cadena fuente, apuntada por DS:SI, a la cadena destino apuntada por ES:DI. Actualiza SI y DI para que apunte al siguiente elemento de la cadena a cargar. Si la bandera D = 0, entonces SI y DI se incrementan pero si D = 1, entonces SI y DI se decrementan (ver las instrucciones STD y CLD). La instrucción MOVSB mueve un byte apuntado por DS:[SI] a ES:[DI] y se actualiza SI y DI en uno. La instrucción MOVSW mueve un word apuntado por DS:[SI] a ES:[DI] y se actualiza SI y DI en dos.
  • 32. 32 El ensamblador utiliza el operando especificado en MOVS solo para verificar el tipo (byte o word) y para ver si se ha especificado un registro de segmento. Operación: DS:[SI] = cadena_fuente tipo byte y ES:[DI] = cadena_destino tipo byte Si D = 0 cadena_destino = cadena_fuente y SI = SI +1. Si D = 1 cadena_destino = cadena_fuente y SI = SI – 1 DS:[SI] = cadena_fuente tipo word y ES:[DI] = cadena_destino tipo word Si D = 0 cadena_destino = cadena_fuente y SI = SI +2. Si D = 1 cadena_destino = cadena_fuente y SI = SI – 2 Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: en el segmento de datos origen db ' Rien n'est trop beau pour une si belle' destino db 38 dup(0) En el segmento de código push ds sub ax,ax push ax mov ax,datos mov ds,ax ; debido a que DS:[SI] = fuente y mov es,ax ; ES:[DI] = destino, hacemos ES = DS cld lea si,origen lea di,destino mov cx,38 rep movs byte ptr[di], byte ptr[si] ; ; En vez de la última instrucción es mejor utilizar rep movsb para copiar ; byte por byte y es mejor utilizar rep movsw para copiar word por word. Oreándoos movs byte ptr [di], byte ptr [si] movsb movs word ptr [di], word ptr [si] movsw MUL (Multiply, unsigned) Sintaxis: MUL fuente Descripción: Multiplica, sin tomar en cuenta el signo, AL por fuente (byte). El producto se guarda en AX. Multiplica, sin tomar en cuenta el signo, AX por fuente (word). El producto se guarda en DX:AX. Si C = 1 y O = 1, significa que los datos en AH o en DX son parte del resultado, no representan el signo. Operación: Si fuente byte AX = AL * fuente
  • 33. 33 Si fuente word DX:AX = AX * fuente Si la mitad superior del resultado es cero, entonces C = 0, caso contrario C = 1 y C = O Banderas: O D I T S Z A P C n n n c Ejemplo: mov al,13h ; AL = 13h mov bl,2 mul bl ; AX = 1Ah = 26 mov ax,13h ; AX = FFF3h mov bx,0002 mul bx ; DX:AX = 0000:001A = 26 ; C = 0 y O = 0 mov ax,1964h ; AX = 07ACh mov bx,1973 ; BX = 07B5h mul bx ; DX:AX = 003B:209C = 3874972 ; C = 1 y O = 1 Oreándoos: mul registro 8 mul registro 16 mul memoria 8 mul memoria 16 NEG (Negate) Sintaxis: NEG destino Descripción: Resta el operando destino de cero y devuelve el resultado en el mismo operando. NEG equivale a las instrucciones NOT destino INC Operación: Si destino es tipo byte destino = complemento a 1 de destino destino = destino + 00000001b Si destino es tipo word destino = complemento a 1 de destino destino = destino + 0000000000000001b Banderas: O D I T S Z A P C n n n c c c c c Ejemplo: mov al,0Dh ; al = 00001101 = 13 neg al ; 11110010 ; + 1 ; -------------- ; 11110011 = F3h = -13 Operandos: neg registro 8
  • 34. 34 neg registro 16 neg memoria 8 neg memoria 16 NEG (Negate) Sintaxis: NEG destino Descripción: Resta el operando destino de cero y devuelve el resultado en el mismo operando. NEG equivale a las instrucciones NOT destino INC Operación: Si destino es tipo byte destino = complemento a 1 de destino destino = destino + 00000001b Si destino es tipo word destino = complemento a 1 de destino destino = destino + 0000000000000001b Banderas: O D I T S Z A P C c n n n c c c c c Ejemplo: mov al,0Dh ; al = 00001101 = 13 neg al ; 11110010 ; + 1 ; -------------- ; 11110011 = F3h = -13 Operandos: neg registro 8 neg registro 16 neg memoria 8 neg memoria 16 NOP (No operation) Sintaxis: NOP Descripción: El procesador no hace nada, ejecuta la siguiente instrucción. NEG equivale a las instrucciones NOT destino INC Operación: Ninguna Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: nop Operandos: No necesita operandos
  • 35. 35 NOT (Logical NOT) Sintaxis: NOT destino Descripción: Cambia los bits unos por ceros y viceversa, es decir realiza el complemento a uno del operando destino y devuelve el resultado en el mismo operando. Operación: Si destino es tipo byte destino = complemento a 1 de destino Si destino es tipo word destino = complemento a 1 de destino Banderas: O D I T S Z A P C n n n n n n n n N Ejemplo: mov al,0Dh ; al = 00001101 not al ; al = 11110010 Operandos: not registro 8 not registro 16 not memoria 8 not memoria 16 OR (Logical inclusive OR) Sintaxis: OR destino, fuente Descripción: Operación lógica “O” inclusivo a nivel de bits entre los operandos, es resultado se almacena en el destino. La lógica O es: 00 = 0 01 = 1 10 = 1 11 = 1 Operación: destino = destino OR fuente C = O = 0 Banderas: O D I T S Z A P C 0 n n n c c c 0 Ejemplo: mov al, 0Dh ; al = 00001101 = 0Dh mov bl, D0h ; bl = 11010000 = D0h or al, bl ; al = 11011101 = DDh Operandos: or registro 8, registro 8 or registro 8, memoria 8 or memoria 8, registro 8 or registro 8, constante or memoria 8, constante or registro 16, registro 16 or registro 16, memoria 16
  • 36. 36 or memoria 16, registro 16 or registro 16, constante or memoria 16, constante OUT (Output byte or word) Sintaxis: OUT destino, acumulador Descripción: transfiere del acumulador (AL o AX) al puerto especificado en el operador destino. Si el puerto es un valor entre 0 y 255, el puerto es especificado directamente por su valor numérico. Si el puerto es un valor entre 0 y 65535, el puerto es especificado en el registro DX. Operación: Si acumulador = AL AL se transfiere al puerto Si acumulador = AX AX se transfiere al puerto Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: out 61h, al mov al, 13 mov dx,03F8h out dx, al Operandos: out puerto 8, al out puerto 8, ax out dx, al out dx, ax POP (POP word of stack to destination) Sintaxis: POP destino Descripción: Transfiere un word de la pila, de la posición apuntada por el registro SP, al operador destino, luego se incrementa el registro SP. El operador destino no puede ser el registro CS Operación: destino = word apuntado por SS:SP SP = SP + 2 Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: pop ax Operandos: pop registro 16 (menos el CS) pop memoria 16
  • 37. 37 POPF (POP flags of stack) Sintaxis: POPF destino Descripción: Transfiere los bits de un word de la pila, de la posición apuntada por el registro SP, al registro de banderas, luego se incrementa el registro SP. Registro de banderas = F E D C B A 9 8 7 6 5 4 3 2 1 0 0 D I T S Z A P C Operación: Registro de banderas = word apuntado por SS:SP SP = SP + 2 Banderas: O D I T S Z A P C c c c c c c c c c Ejemplo: popf Operandos: No necesita operandos PUSH (PUSH word onto stack) Sintaxis: PUSH fuente Descripción: Decrementa el puntero SP en dos y luego transfiere la palabra especificada en el operando fuente apuntado por SP. El operador fuente no puede ser el registro CS Operación: SP = SP – 2 fuente = palabra apuntada por SS:SP Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: push ax Operandos: push registro 16 (menos el CS debido a que no se acepta POP CS) push memoria 16 PUSHF (PUSH flags ono stack) Sintaxis: PUSH Descripción: Decrementa el puntero SP en dos y luego transfiere los valores de las banderas a bits específicos de la palabra apuntada por SP. Registro de banderas = F E D C B A 9 8 7 6 5 4 3 2 1 0 0 D I T S Z A P C Operación: SP = SP – 2 Palabra direccionada por SS:SP = registro de banderas
  • 38. 38 Banderas: O D I T S Z A P C c c c c c c c c c Ejemplo: pushf Operandos: No necesita operandos RCL (Rotate through carry left) Sintaxis: RCL destino, contador Descripción: Rotar a la izquierda los bits del operando destino a través de la bandera de acarreo, el número de veces especificado en el contador. El bit de la bandera C se desplaza a la posición más significativa del operando destino. Si el número de bits a desplazar es 1, se puede especificar directamente, pero si el número de bits a desplazar es mayor a 1, su valor debe cargarse en CL como segundo operando. Operación: contador = constante Mientras contador ≠ 0 C = bit más significativo del operando destino Bit menos significativo del operando destino = C contador = contador – 1 Banderas: O D I T S Z A P C c n n n n n n n c Ejemplo: mov cl, 4 mov al, 00110001b rcl al,cl Operandos: rcl registro 16, 1 rcl registro 16, cl rcl memoria 16, 1 rcl memoria 16, cl rcl registro 8, 1 rcl registro 8, cl rcl memoria 8, 1 rcl memoria 8, cl RCR (Rotate through carry right) Sintaxis: RCR destino, contador Descripción: Rotar a la derecha los bits del operando destino a través de la bandera de acarreo, el número de veces especificado en el contador. El bit de la bandera C se desplaza a la posición más significativa del operando destino. Si el número de bits a desplazar es 1, se puede especificar directamente, pero si el número de bits a desplazar es mayor a 1, su valor debe cargarse en CL como segundo operando.
  • 39. 39 Operación: contador = constante Mientras contador ≠ 0 C = bit menos significativo del operando destino Bit más significativo del operando destino = C contador = contador – 1 Banderas: O D I T S Z A P C c n n n n n n n c Ejemplo: mov cl, 4 mov al, 01110011b rcr al,cl Operandos: rcr registro 16, 1 rcr registro 16, cl rcr memoria 16, 1 rcr memoria 16, cl rcr registro 8, 1 rcr registro 8, cl rcr memoria 8, 1 rcr memoria 8, cl REP (Repeat string operation) REPE (Repeat string operation if equal) REPZ (Repeat string operation if zero) REPNE (Repeat string operation if not equal) REPNZ (Repeat string operation if not zero) Sintaxis: REP instrucción de cadenas REPE instrucción de cadenas REPZ instrucción de cadenas REPNE instrucción de cadenas REPNZ instrucción de cadenas Descripción: Son prefijos que repiten una operación de cadena un número específico de veces o hasta que se cumpla una condición de cero o no cero. Se carga CX con un valor. Para REP la operación se repite mientras CX ≠ 0. Se carga CX con un valor. Para REPE/REPZ la operación se repite mientras Z = 1 y CX ≠ 0. Se carga CX con un valor. Para REPNE/REPNZ la operación se repite mientras Z = 0 y CX ≠ 0. Operación: CX = valor REP repite la operación mientras CX ≠ 0. REPE/REPZ repite la operación mientras Z = 1 y CX ≠ 0. REPNE/REPNZ repite la operación mientras Z = 0 y CX ≠ 0. En todos los casos CX = CX – 1 después de cada operación.
  • 40. 40 Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: mov cx, 10 lea si, texto1 lea di, texto2 rep movsb Operandos: rep instrucción de cadena repe instrucción de cadena repz instrucción de cadena repne instrucción de cadena repnz instrucción de cadena RET (Return) Sintaxis: RET valor Descripción: Regresa de un procedimiento al que se entró previamente por un CALL cercano o lejano. El ensamblador genera un RET cercano si está dentro de un procedimiento etiquetado como NEAR y un RET lejano si está entro de un procedimiento etiquetado como FAR. Para el caso cercano, RET mueve la palabra en el tope de la pila al IP e incrementa al SP en dos. Para el caso lejano, RET mueve las palabras en el tope de la pila al IP y CS e incrementa el SP en cuatro. Cuando se utiliza RET valor, se realiza SP = SP + valor Operación: Caso cercano. IP = [SP]. SP = SP + 2 Caso lejano. IP = [SP] y SP = SP + 2 CS = [SP] y SP = SP + 2 Si RET valor SP = SP + valor Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: ret ret 4 ; Retorna de un procedimiento NEAR con dos parámetros ; de direcciones. (4 = 2 parámetros x 2 byte/parámetro) ret 8 ; Retorna de un procedimiento FAR con dos parámetros ; de direcciones. (8 = 2 parámetros x 4 byte/parámetro) Operandos: ret ret valor
  • 41. 41 ROL (Rotate left) Sintaxis: ROL destino, contador Descripción: Rotar a la izquierda los bits del operando destino, el número de veces especificado en el contador. El bit más significativo se desplaza a la posición menos significativa del operando destino. El bit más significativo también entra a la bandera C. Si el número de bits a desplazar es 1, se puede especificar directamente, pero si el número de bits a desplazar es mayor a 1, su valor debe cargarse en CL como segundo operando. Operación: contador = constante Mientras contador ≠ 0 bit menos significativo = bit más significativo bandera C = bit más significativo contador = contador – 1 Banderas: O D I T S Z A P C c n n n n n n n c Ejemplo: mov cl, 4 mov al, 01110011b rol al,cl Operandos: rol registro 16, 1 rol registro 16, cl rol memoria 16, 1 rol memoria 16, cl rol registro 8, 1 rol registro 8, cl rol memoria 8, 1 rol memoria 8, cl ROR (Rotate right) Sintaxis: ROR destino, contador Descripción: Rotar a la derecha los bits del operando destino, el número de veces especificado en el contador. El bit menos significativo se desplaza a la posición más significativa del operando destino. El bit menos significativo también entra a la bandera C. Si el número de bits a desplazar es 1, se puede especificar directamente, pero si el número de bits a desplazar es mayor a 1, su valor debe cargarse en CL como segundo operando. Operación: contador = constante Mientras contador ≠ 0 bit más significativo = bit menos significativo bandera C = bit menos significativo contador = contador – 1
  • 42. 42 Banderas: O D I T S Z A P C c n n n n n n n c Ejemplo: mov cl, 4 mov al, 01110011b ror al,cl Operandos: ror registro 16, 1 ror registro 16, cl ror memoria 16, 1 ror memoria 16, cl ror registro 8, 1 ror registro 8, cl ror memoria 8, 1 ror memoria 8, cl SAHF (Store AH in flags) Sintaxis: SAHF Descripción: Transfiere bits específicos del registro AH a las banderas S, Z, A, P y C. Operación: 7 6 5 4 3 2 1 0 del registro AH S Z A P C Banderas: O D I T S Z A P C n n n n c c c c C Ejemplo: sahf Operandos: No necesita operandos. SAL (Shift arithmetic left) SHL (Shift logical left) Sintaxis: SAL destino, contador SHL destino, contador Descripción: Desplaza a la izquierda los bits del operando destino la cantidad de veces especificada en contador. Los bits de la derecha del operando destino se rellenan con ceros y los bits que salen de la izquierda del operador se pierden. Si el número de bits a desplazar es 1, se puede especificar directamente, pero si el número de bits a desplazar es mayor a 1, su valor debe cargarse en CL como segundo operando. SAL y SHL son físicamente la misma instrucción. Operación: contador = constante Mientras contador ≠ 0 bit menos significativo = 0 contador = contador – 1
  • 43. 43 Banderas: O D I T S Z A P C c n n n c c c c Ejemplo: mov cl, 4 mov al, 01110011b sal al,cl Operandos: sal registro 16, 1 sal registro 16, cl sal memoria 16, 1 sal memoria 16, cl sal registro 8, 1 sal registro 8, cl sal memoria 8, 1 sal memoria 8, cl SAR (Shift arithmetic right) Sintaxis: SAR destino, contador Descripción: Desplaza a la derecha los bits del operando destino la cantidad de veces especificada en contador. Los bits de la izquierda del operando destino se rellenan con ceros y los bits que salen de la derecha del operador se pierden. Si el número de bits a desplazar es 1, se puede especificar directamente, pero si el número de bits a desplazar es mayor a 1, su valor debe cargarse en CL como segundo operando. Operación: contador = constante Mientras contador ≠ 0 bit más significativo = 0 contador = contador – 1 Banderas: O D I T S Z A P C c n n n c c c c Ejemplo: mov cl, 4 mov al, 01110011b sar al,cl Operandos: sar registro 16, 1 sar registro 16, cl sar memoria 16, 1 sar memoria 16, cl sar registro 8, 1 sar registro 8, cl sar memoria 8, 1 sar memoria 8, cl
  • 44. 44 SBB (Subtract with borrow) Sintaxis: SBB destino, fuente Descripción: Resta el operando fuente del operando destino. Si la bandera C = 1, además se resta uno del operando destino. El resultado se deposita en el operando destino. Los operandos deben ser del mismo tipo. Operación: destino = destino – fuente Si C = 1 destino = destino – 1 Banderas: O D I T S Z A P C c n n n c c c c c Ejemplo: mov al, 101 ; al = 65h mov bl, 155 ; bl = 9Bh add al, bl ; ax = 0000h, C = 1 sbb al, 3 ; ax = FFFCh Operandos: sbb registro 8, registro 8 sbb registro 16, registro 16 sbb registro 8, memoria 8 sbb registro 16, memoria 16 sbb memoria 8, registro 8 sbb memoria 16, registro 16 sbb registro 8, 30 sbb registro 16, 124h sbb memoria 8, 25h sbb memoria 16, 1409h SCAS (Scan string) SCASB (Scan string byte) SCASW (Scan string word) Sintaxis: SCAS cadena_destino SCASB SCASW Descripción: Busca un byte (en AL) o una palabra (en AX) en la cadena destino, apuntada por ES:DI. Actualiza DI para que apunte al siguiente elemento de la cadena a cargar. Si la bandera D = 0, entonces DI se incremente pero si D = 1, entonces DI se decrementa (ver las instrucciones STD y CLD). La instrucción SCASB busca un byte = AL en la cadena apuntada por ES:[DI] y se actualiza DI en uno. La instrucción SCASW busca un word = AX en la cadena apuntada por ES:[DI] y se actualiza DI en dos.
  • 45. 45 El ensamblador utiliza el operando especificado en SCAS solo para verificar el tipo (byte o word) y para ver si se ha especificado un registro de segmento. Estas instrucciones se utilizan con los prefijos REPE(REPZ) o REPNE(REPNZ). Operación: Si D = 0, AL – ES:[DI], y SI = SI +1 Si D = 0, AX – ES:[DI], y SI = SI + 2 Si D = 1, AL – ES:[DI], y SI = SI – 1 Si D = 1, AX – ES:[DI], y SI = SI – 2 Banderas: O D I T S Z A P C c n n n c c c c c Ejemplo: en el segmento de datos destino db ' Rien n'est trop beau pour une si belle' En el segmento de código push ds sub ax, ax push ax mov ax, datos mov ds, ax ; mov es, ax ; Debido a que ES:[DI] = destino, ; hacemos ES = DS cld lea di, destino mov cx, 38 rep movs byte ptr[di], byte ptr[si] ; ; En vez de la última instrucción es mejor utilizar rep movsb para ; buscar byte por byte y es mejor utilizar rep movsw para buscar ; word por word. Operandos: scas memoria 8 scasb scas memoria 16 scasw SHR (Shift logical right) Sintaxis: SHR destino, contador Descripción: Desplaza a la derecha los bits del operando destino la cantidad de veces especificada en contador. Los bits de la izquierda del operando destino se rellenan con ceros y los bits que salen de la derecha del operador se pierden. Si el número de bits a desplazar es 1, se puede especificar directamente, pero si el número de bits a desplazar es mayor a 1, su valor debe cargarse en CL como segundo operando. Funciona exactamente igual que la instrucción SAL
  • 46. 46 Operación: contador = constante Mientras contador ≠ 0 bit más significativo = 0 contador = contador – 1 Banderas: O D I T S Z A P C c n n n c c c c Ejemplo: mov cl, 4 mov al, 01110011b shr al,cl Operandos: shr registro 16, 1 shr registro 16, cl shr memoria 16, 1 shr memoria 16, cl shr registro 8, 1 shr registro 8, cl shr memoria 8, 1 shr memoria 8, cl STC (Set carry flag) Sintaxis: STC Descripción: Pone a uno la bandera de acarreo sin afectar a ninguna otra bandera Operación: C = 1 Banderas: O D I T S Z A P C n n n n n n n n 1 Ejemplo: stc Operandos: No necesita operandos. STD (Set direction flag) Sintaxis: STD Descripción: Pone a uno la bandera de dirección sin afectar a ninguna otra bandera Operación: D = 1 Banderas: O D I T S Z A P C n 1 n n n n n n n Ejemplo: std Operandos: No necesita operandos.
  • 47. 47 STI (Set interrupt flag) Sintaxis: STI Descripción: Pone a uno la bandera de interrupciones sin afectar a ninguna otra bandera Operación: I = 1 Banderas: O D I T S Z A P C n n 1 n n n n n n Ejemplo: sti ; activa las interrupciones enmascarables Operandos: No necesita operandos. STOS (Store string) STOSB (Store string byte) STOSW (Store string word) Sintaxis: STOS cadena_destino STOSB STOSW Descripción: Transfiere un byte o un apalabra del acumulador AL o AX a la cadena destino, apuntada por ES:DI,. Actualiza DI para que apunte al siguiente elemento de la cadena a almacenar. Si la bandera D = 0, entonces DI se incremente pero si D = 1, entonces DI se decrementa (ver las instrucciones STD y CLD). La instrucción STOSB almacena el registro AL en la dirección ES:[DI] y se actualiza DI en uno. La instrucción STOSW almacena el registro AX en la dirección ES:[DI] y se actualiza DI en dos. El ensamblador utiliza el operando especificado en STOS solo para verificar el tipo (byte o word) y para ver si se ha especificado un registro de segmento. Operación: Si D = 0 y ES:[DI] = AL y SI = SI +1 Si D = 0 y DS:[SI] = AX y SI = SI + 2 Si D = 1 y DS:[SI] = AL y SI = SI – 1 Si D = 1 y DS:[SI] = AX y SI = SI – 2 Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: en el segmento de datos pantalla db 80*25*2 dup(0) En el segmento de código push ds
  • 48. 48 sub ax, ax push ax mov ax, datos mov ds, ax ; mov ax, 0B800h ; Debido a que ES:[DI] = destino, mov es, ax ; apuntamos con ES:[DI] a =0B800h cld mov al, 20h lea di, pantalla rep stos byte ptr [DI] ; ; Como la cadena es tipo byte la última instrucción se puede reemplazar ; por ; rep stosb Operandos: stos memoria 8 stosb stos memoria 16 stosw SUB (Subtract) Sintaxis: SUB destino, fuente Descripción: Resta el operando fuente del operando destino. El resultado se deposita en el operando destino. Los operandos deben ser del mismo tipo. Operación: destino = destino – fuente Banderas: O D I T S Z A P C c n n n c c c c c Ejemplo: mov al, 5 ; al = 05h mov bl, 3 ; bl = 03h sub al, bl ; ax = 02h Operandos: sub registro 8, registro 8 sub registro 16, registro 16 sub registro 8, memoria 8 sub registro 16, memoria 16 sub memoria 8, registro 8 sub memoria 16, registro 16 sub registro 8, 30 sub registro 16, 124h sub memoria 8, 25h sub memoria 16, 1409h TEST (Test) Sintaxis: TEST destino, fuente Descripción: “Y lógico” a nivel de bits, el resultado no se deposita en el operando destino. Los operandos deben ser del mismo tipo.
  • 49. 49 Operación: destino “Y lógico” fuente Banderas: O D I T S Z A P C 0 n n n c c c 0 Ejemplo: mov al, 10000000b test al, 10000000b jnz otro Operandos: test registro 8, registro 8 test registro 16, registro 16 test registro 8, memoria 8 test registro 16, memoria 16 test memoria 8, registro 8 test memoria 16, registro 16 test registro 8, 101b test registro 16, 124h test memoria 8, 25h test memoria 16, 1409h WAIT (Wait) Sintaxis: WAIT Descripción: Pone el procesador en estado de espera. El estado de espera es abandonado cuando la patita TEST es activada. WAIT chequea la línea TEST cada cinco intervalos de reloj. WAIT y TEST se utilizan para comunicar el procesador principal con otros procesadores. Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: wait Operandos: No necesita operandos. XCHG (Exchange) Sintaxis: XCHG destino, fuente Descripción: Intercambia el contenido entre los dos operandos, tipo byte o word. No se pueden utilizar los registros de segmento Operación: aux = destino destino = fuente fuente = aux Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: xchg al, ah Operandos: xchg registro 8, registro 8
  • 50. 50 xchg registro 8, memoria 8 xchg memoria 8, registro 8 xchg registro 16, registro 16 xchg registro 16, memoria 16 xchg memoria 16, registro 16 xchg registro 8, 13h xchg registro 16, 1973h XLAT (Translate) Sintaxis: XLAT tabla_fuente Descripción: Saca un byte de una tabla apuntada por BX, utilizando AL como índice para posicionarse en la dirección requerida. La tabla tiene que ser tipo byte y debe tener una longitud máxima de 256 bytes Operación: AL = byte direccionado por (BX + AL) Banderas: O D I T S Z A P C n n n n n n n n n Ejemplo: en el segmento de datos tabla db 1,3,5,7,9,11 En el segmento de código lea bx,tabla mov al, 3 xlat tabla ; al = 7 ; ; esto equivale a ; mov al, tabla[3] Operandos: xlat memoria 8 XOR (Logical exclusive OR) Sintaxis: XOR destino, fuente Descripción: Operación lógica “O” exclusivo a nivel de bits entre los operandos, es resultado se almacena en el destino. La lógica XOR es: 00 = 0 01 = 1 10 = 1 11 = 0 Operación: destino = destino XOR fuente C = O = 0
  • 51. 51 Banderas: O D I T S Z A P C 0 n n n c c c 0 Ejemplo: mov al, 0Dh ; al = 00001101 = 0Dh mov bl, D0h ; bl = 11010000 = D0h xor al, bl ; al = 11011101 = DDh Operandos: or registro 8, registro 8 or registro 8, memoria 8 or memoria 8, registro 8 or registro 8, constante or memoria 8, constante or registro 16, registro 16 or registro 16, memoria 16 or memoria 16, registro 16 or registro 16, 28h or memoria 16, 1964h