INSTRUCCIONES
DE ENSAMBLADOR
Instrucciones del 8086 y 8088. INSTRUCCIONES DE TRANSFERENCIA DE
DATOS (No afectan flags) MOV
dest,src Copia
el contenido del operando fuente (src) en el
destino (dest). Operación:
dest <- src Las
posibilidades son: 1.
MOV reg,{reg|mem|inmed} 2.
MOV mem,{reg|inmed} 3.
MOV {reg16|mem16},{CS|DS|ES|SS} 4.
MOV {DS|ES|SS},{reg16|mem16} PUSH
src Pone
el valor en el tope del stack. Operación:
SP <- SP - 2, [SP+1:SP] <- src donde
src = {reg16|mem16|CS|DS|ES|SS}. POP
des t Retira
el valor del tope del stack poniéndolo en el lugar
indicado. Operación:
dest <- [SP+1:SP], SP <- SP + 2 donde
dest = {reg16|mem16|DS|ES|SS}. XCHG
reg,{reg|mem} Intercambia
ambos valores. IN
{AL|AX},{DX|inmed (1 byte)} Pone
en el acumulador el valor hallado en el port indicado. OUT
{DX|inmed (1 byte)},{AL|AX} Pone
en el port indicado el valor del acumulador. XLAT
Realiza
una operación de traducción de un código de un byte a
otro código de un byte mediante una tabla. Operación:
AL <- [BX+AL] LEA
reg,mem Almacena
la dirección efectiva del operando de memoria en un
registro. Operación:
reg <- dirección mem LDS
reg,mem32 Operación:
reg <- [mem], DS <- [mem+2] LES
reg,mem32 Operación:
reg <- [mem], ES <- [mem+2] LAHF Copia
en el registro AH la imagen de los ocho bits menos
significativos del registro de indicadores. Operación:
AH <- SF:ZF:X:AF:X:PF:X:CF SAHF
Almacena
en los ocho bits menos significativos del registro de
indicadores el valor del registro AH. Operación:
SF:ZF:X:AF:X:PF:X:CF <- AH PUSHF
Almacena
los flags en la pila. Operación:
SP <- SP - 2, [SP+1:SP] <- Flags. POPF Pone
en los flags el valor que hay en la pila. Operación:
Flags <- [SP+1:SP], SP <- SP + 2 INSTRUCCIONES ARITMETICAS(Afectan los flags AF, CF, OF, PF, SF,
ZF) ADD
dest,src Operación:
dest <- dest + src. ADC
dest,src Operación:
dest <- dest + src + CF. SUB
dest,src Operación:
dest <- dest - src. SBB
dest,src Operación:
dest <- dest - src - CF. CMP
dest,src Operación:
dest - src (sólo afecta flags). INC
dest Operación:
dest <- dest + 1 (no afecta CF). DEC
dest Operación:
dest <- dest - 1 (no afecta CF). NEG
dest Operación:
dest <- - dest. donde
dest = {reg|mem} y src = {reg|mem|inmed}
no pudiendo ambos operandos estar en memoria. DAA
Corrige
el resultado de una suma de dos valores BCD empaquetados
en el registro AL (debe estar inmediatamente después de
una instrucción ADD o ADC). OF es indefinido después de
la operación. DAS Igual
que DAA pero para resta (debe estar inmediatamente
después de una instrucción SUB o SBB). AAA Lo
mismo que DAA para números BCD desempaquetados. AAS
Lo
mismo que DAS para números BCD desempaquetados. AAD
Convierte
AH:AL en BCD desempaquetado a AL en binario. Operación:
AL <- AH * 0Ah + AL, AH <- 0. Afecta
PF, SF, ZF, mientras que AF, CF y OF quedan indefinidos. AAM
Convierte
AL en binario a AH:AL en BCD desempaquetado. Operación:
AH <- AL / 0Ah, AL <- AL mod 0Ah.
Afecta PF, SF, ZF, mientras que AF, CF y OF quedan
indefinidos. MUL
{reg8|mem8} Realiza
una multiplicación con operandos no signados de 8 por 8
bits. Operación:
AX <- AL * {reg8|mem8}. CF=OF=0 si AH = 0,
CF=OF=1 en caso contrario. AF, PF, SF, ZF quedan
indefinidos. MUL
{reg16|mem16} Realiza
una multiplicación con operandos no signados de 16 por
16 bits. Operación:
DX:AX <- AX * {reg16|mem16}. CF=OF=0 si DX = 0,
CF=OF=1 en caso contrario. AF, PF, SF, ZF quedan
indefinidos. IMUL
{reg8|mem8} Realiza
una multiplicación con operandos con signo de 8 por 8
bits. Operación:
AX <- AL * {reg8|mem8} realizando la
multiplicación con signo. CF = OF = 0 si el resultado
entra en un byte, en caso contrario valdrán 1. AF, PF,
SF, ZF quedan indefinidos. IMUL
{reg16|mem16} Realiza
una multiplicación con operandos con signo de 16 por 16
bits. Operación:
DX:AX <- AX * {reg16|mem16} realizando la
multiplicación con signo. CF = OF = 0 si el resultado
entra en dos bytes, en caso contrario valdrán 1. AF, PF,
SF, ZF quedan indefinidos. CBW
Extiende
el signo de AL en AX. No se afectan los flags. CWD Extiende
el signo de AX en DX:AX. No se afectan flags. INSTRUCCIONES LOGICAS (Afectan AF, CF, OF, PF, SF, ZF) AND
dest,src Operación:
dest <- dest and src. TEST
dest,src Operación:
dest and src. Sólo afecta flags. OR
dest,src Operación:
dest <- dest or src. XOR
dest,src Operación:
dest <- dest xor src. Las
cuatro instrucciones anteriores ponen CF = OF = 0, AF
queda indefinido y PF, SF y ZF dependen del resultado. NOT
dest Operación:
dest <- Complemento a 1 de dest. No afecta los
flags. SHL/SAL
dest,{1|CL} Realiza
un desplazamiento lógico o aritmético a la izquierda. SHR
dest,{1|CL} Realiza
un desplazamiento lógico a la derecha. SAR
dest,{1|CL} Realiza
un desplazamiento aritmético a la derecha. ROL
dest,{1|CL} Realiza
una rotación hacia la izquierda. ROR
dest,{1|CL} Realiza
una rotación hacia la derecha. RCL
dest,{1|CL} Realiza
una rotación hacia la izquierda usando el CF. RCR
dest,{1|CL} Realiza
una rotación hacia la derecha usando el CF. En
las siete instrucciones anteriores la cantidad de veces
que se rota o desplaza puede ser un bit o la cantidad de
bits indicado en CL. INSTRUCCIONES
DE MANIPULACION DE CADENAS: MOVSB Copiar
un byte de la cadena fuente al destino. Operación: 1.
ES:[DI] <- DS:[SI] (un byte) 2.
DI <- DI±1 3.
SI <- SI±1 MOVSW Copiar
dos bytes de la cadena fuente al destino. Operación: 1.
ES:[DI] <- DS:[SI] (dos bytes) 2.
DI <- DI±2 3.
SI <- SI±2 LODSB Poner
en el acumulador un byte de la cadena fuente. Operación: 1.
AL <- DS:[SI] (un byte) 2.
SI <- SI±1 LODSW Poner
en el acumulador dos bytes de la cadena fuente. Operación: 1.
AX <- DS:[SI] (dos bytes) 2.
SI <- SI±2 STOSB Almacenar
en la cadena destino un byte del acumulador. Operación: 1.
ES:[DI] <- AL (un byte) 2.
DI <- DI±1 STOSW Almacenar
en la cadena destino dos bytes del acumulador. Operación: 1.
ES:[DI] <- AX (dos bytes) 2.
DI <- DI±2 CMPSB Comparar
un byte de la cadena fuente con el destino. Operación: 1.
DS:[SI] - ES:[DI] (Un byte, afecta sólo los flags) 2.
DI <- DI±1 3.
SI <- SI±1 CMPSW Comparar
dos bytes de la cadena fuente con el destino. Operación: 1.
DS:[SI] - ES:[DI] (Dos bytes, afecta sólo los flags) 2.
DI <- DI±2 3.
SI <- SI±2 SCASB Comparar
un byte del acumulador con la cadena destino. Operación: 1.
AL - ES:[DI] (Un byte, afecta sólo los flags) 2.
DI <- DI±1 SCASW Comparar
dos bytes del acumulador con la cadena destino. Operación: 1.
AX - ES:[DI] (Dos byte, afecta sólo los flags) 2.
DI <- DI±2 En
todos los casos el signo + se toma si el indicador
DF vale cero. Si vale 1 hay que tomar el signo -.
Prefijo para las instrucciones MOVSB, MOVSW, LODSB,
LODSW, STOSB y STOSW: REP:
Repetir la instrucción CX veces. Prefijos
para las instrucciones CMPSB, CMPSW, SCASB, SCASW: REPZ/REPE:
Repetir mientras que sean iguales hasta un máximo de CX
veces. REPNZ/REPNE:
Repetir mientras que sean diferentes hasta un máximo de
CX veces. INSTRUCCIONES DE
TRANSFERENCIA DE CONTROL (No afectan los flags): JMP
label Saltar
hacia la dirección label. CALL
label Ir
al procedimiento cuyo inicio es label. Para
llamadas dentro del mismo segmento equivale a PUSH
IP: JMP label, mientras que para llamadas
entre segmentos equivale a PUSH CS: PUSH IP:
JMP label. RET Retorno
de procedimiento. RET
inmed Retorno
de procedimiento y SP <- SP + inmed. Variaciones
de la instrucción de retorno: RETN
[inmed] En
el mismo segmento de código. Equivale a POP IP [:SP
<- SP + inmed]. RETF
[inmed] En
otro segmento de código. Equivale a POP IP: POP
CS [:SP <- SP + inmed] Saltos
condicionales aritméticos (usar después de CMP): Aritmética
signada (con números positivos, negativos y cero) JL
etiqueta/JNGE etiqueta Saltar
a etiqueta si es menor. JLE
etiqueta/JNG etiqueta Saltar
a etiqueta si es menor o igual. JE
etiqueta Saltar
a etiqueta si es igual. JNE
etiqueta Saltar
a etiqueta si es distinto. JGE
etiqueta/JNL etiqueta Saltar
a etiqueta si es mayor o igual. JG
etiqueta/JNLE etiqueta Saltar
a etiqueta si es mayor. Aritmética
sin signo (con números positivos y cero) JB
etiqueta/JNAE etiqueta Saltar
a etiqueta si es menor. JBE
etiqueta/JNA etiqueta Saltar
a etiqueta si es menor o igual. JE
etiqueta Saltar
a etiqueta si es igual. JNE
etiqueta Saltar
a etiqueta si es distinto. JAE
etiqueta/JNB etiqueta Saltar
a etiqueta si es mayor o igual. JA
etiqueta/JNBE etiqueta Saltar
a etiqueta si es mayor. Saltos
condicionales según el valor de los indicadores: JC
label Saltar
si hubo arrastre/préstamo (CF = 1). JNC
label Saltar
si no hubo arrastre/préstamo (CF = 0). JZ
label Saltar
si el resultado es cero (ZF = 1). JNZ
label Saltar
si el resultado no es cero (ZF = 0). JS
label Saltar
si el signo es negativo (SF = 1). JNS
label Saltar
si el signo es positivo (SF = 0). JP/JPE
label Saltar
si la paridad es par (PF = 1). JNP/JPO
label Saltar
si la paridad es impar (PF = 0). Saltos
condicionales que usan el registro CX como contador: LOOP
label Operación:
CX <- CX-1. Saltar a label si CX<>0. LOOPZ/LOOPE
label Operación:
CX <- CX-1. Saltar a label si CX <> 0 y ZF = 1. LOOPNZ/LOOPNE
label Operación:
CX <- CX-1. Saltar a label si CX <> 0 y ZF = 0. JCXZ
label Operación:
Salta a label si CX = 0. Interrupciones: INT
número Salva
los flags en la pila, hace TF=IF=0 y ejecuta la
interrupción con el número indicado. INTO Interrupción
condicional. Si OF = 1, hace INT 4. IRET Retorno
de interrupción. Restaura los indicadores del stack. Instrucciones del
80286 ARPL
dest, src (Adjust Requested Privilege Level
of selector): Compara los bits RPL de dest contra
src. Si
el RPL de dest es menor que el RPL de src,
los bits RPL del destino se cargan con los bits RPL de src
y el indicador ZF se pone a uno. En caso contrario ZF
se pone a cero. Ver nota 1. CLTS
(Clear Task Switched Flag): Pone a cero el
indicador TS (bit 3 de la palabra de control de la
máquina MSW). LAR
dest, src (Load Access Rights): El byte más
alto del registro destino se carga con el byte de
derechos de acceso del segmento indicado por el selector
almacenado en src. Pone ZF a uno si se puede
realizar la carga. LGDT
mem64 (Load Global Table register):
Carga el valor del operando en el registro GDTR. Antes de
ejecutar esta instrucción la tabla debe estar en
memoria. LIDT
mem64 (Load Interrupt Table register):
Carga el valor del operando en el registro IDTR. Antes de
ejecutar esta instrucción la tabla debe estar en
memoria. LLDT
{reg16|mem16} (Load Local Descriptor Table
Register): Carga el selector indicado por el operando
en el registro LDTR. Antes de ejecutar esta instrucción
la tabla deberá estar en memoria. LMSW
{reg16|mem16} (Load Machine Status Word):
Carga el valor del operando en la palabra de estado de la
máquina MSW. El bit PE (bit 0) no puede
ser puesto a cero por esta instrucción, por lo que una
vez que se cambió a modo protegido, la única manera de
volver a modo real es mediante un RESET del
microprocesador. LSL
dest, src (Load Segment Limit): Carga
el límite del segmento de un selector especificado en src
en el registro destino si el selector es válido y
visible en el nivel de privilegio actual. Si ocurre lo
anterior el indicador ZF se pone a uno, en caso
contrario, se pone a cero. LTR
{reg16|mem16} (Load Task Register):
Carga el selector indicado por el operando en el registro
TR. El
TSS (Task State Segment) apuntado por el nuevo TR
deberá ser válido. SGDT
mem64 (Store Global Descriptor Table
register): Almacena el contenido del registro GDTR en
el operando especificado. SIDT
mem64 (Store Interrupt Descriptor Table
register): Almacena el contenido del registro IDTR en
el operando especificado. SLDT
{reg16|mem16} (Store Global Descriptor
Table register): Almacena el contenido del registro LDTR
(que es un selector a la tabla de descriptores globales)
en el operando especificado. SMSW
{reg16|mem16} (Store Machine Status Word):
Almacena la palabra de estado de la máquina MSW en
el operando especificado. STR
{reg16|mem16} (Store Task Register):
Almacena el registro de tarea actual (selector a la tabla
de descriptores globales) en el operando especificado. VERR/VERW
{reg16|mem16} (Verify Read/Write):
Verifica si el selector de segmento especificado en el
operando es válido y se puede leer/escribir en el nivel
de privilegio actual. En este caso se pone ZF a uno, en
caso contrario se pone ZF a cero. Instrucciones del 80386 BSF
dest, src (Bit Scan Forward): Busca el primer
bit puesto a 1 del operando fuente src (comenzando
por el bit cero hasta el bit n-1). Si lo encuentra pone
el indicador ZF a 1 y carga el destino dest con el
índice a dicho bit. En caso contrario pone ZF a 0. BSR
dest, src (Bit Scan Reverse): Busca el primer
bit puesto a 1 del operando fuente src (comenzando
por el bit n-1 hasta el bit cero). Si lo encuentra pone
el indicador ZF a 1 y carga el destino dest con el
índice a dicho bit. En caso contrario pone ZF a 0. BT
dest, src (Bit Test): El bit del destino dest
indexado por el valor fuente se copia en el indicador
CF. BTC
dest, src (Bit Test with Complement): El bit
del destino dest indexado por el valor fuente se
copia en el indicador CF y luego se complementa dicho
bit. BTR
dest, src (Bit Test with Reset): El bit del
destino dest indexado por el valor fuente src se
copia en el indicador CF y luego pone dicho bit a cero. BTS
dest, src (Bit Test with Set): El bit del
destino dest indexado por el valor fuente src se
copia en el indicador CF y luego pone dicho bit a uno. CDQ
(Convert Doubleword to Quadword): Convierte el
número signado de 4 bytes en EAX
en un número signado de 8 bytes en EDX:EAX copiando
el bit más significativo (de signo) de EAX en
todos los bits de EDX. CWDE
(Convert Word to Extended Doubleword): Convierte una
palabra signada en el registro AX en una doble
palabra signada en EAX copiando el bit de signo
(bit 15) de AX en los bits 31-16 de EAX. JECXZ
label (Jump on ECX Zero): Salta a la etiqueta label
si el registro ECX vale cero. LFS,
LGS, LSS dest, src (Load pointer
using FS, GS, SS): Carga un puntero
de 32 bits de la memoria src al registro de uso
general destino dest y FS, GS o SS.
El offset se ubica en el registro destino y el segmento
en FS, GS o SS. Para usar esta
instrucción la palabra en la dirección indicada por src
debe contener el offset, y la palabra siguiente debe
contener el segmento. Esto simplifica la carga de
punteros lejanos (far) de la pila y de la tabla de
vectores de interrupción. MOVSX
dest, src (Move with Sign eXtend): Copia el
valor del operando fuente src al registro destino dest
(que tiene el doble de bits que el operando fuente)
extendiendo los bits del resultado con el bit de signo.
Se utiliza para aritmética signada (con números
positivos y negativos). MOVZX
dest, src (Move with Zero eXtend): Copia el
valor del operando fuente src al registro destino dest
(que tiene el doble de bits que el operando fuente)
extendiendo los bits del resultado con ceros. Se utiliza
para aritmética no signada (sin números negativos). POPAD
(Pop All Doubleword Registers): Retira los ocho registros
de uso general de 32 bits de la pila en el siguiente
orden: EDI, ESI, EBP, ESP, EBX, EDX, ECX, EAX. El valor
de ESP retirado de la pila se descarta. POPFD
(Pop Doubleword Flags): Retira de la pila los indicadores
completos (32 bits). PUSHAD
(Push All Doubleword Registers): Pone los ocho registros
de uso general de 32 bits en la pila en el siguiente
orden: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI. PUSHFD
(Push Doubleword Flags): Pone los 32 bits del
registro de indicadores en la pila. SETcc
dest (Set Byte on Condition cc): Pone el byte
del destino dest a uno si se cumple la condición,
en caso contrario lo pone a cero. Las condiciones son las
mismas que para los saltos condicionales (se utilizan las
mismas letras que van después de la "J"). SHLD
dest, src, count (Shift Left Double
precision): Desplaza dest a la izquierda count veces
y las posiciones abiertas se llenan con los bits
más significativos de src. SHRD
dest, src, count (Shift Left Double
precision): Desplaza dest a la derecha count veces
y las posiciones abiertas se llenan con los bits menos
significativos de src. Instrucciones del
80387 FSIN:
Calcula el seno del valor en ST. El resultado reemplaza
el valor anterior de ST. FCOS:
Calcula el coseno del valor en ST. El resultado reemplaza
el valor anterior de ST. FSINCOS:
Calcula el seno y el coseno del valor en ST. Cuando se
completa la instrucción, el valor de ST es el coseno del
ST original, mientras que en ST(1) se encuentra el seno.
Como se realiza una introducción en la pila, el valor
que antes se encontaba en ST(1) ahora estará en ST(2). FUCOM
ST(i): Realiza una comparación entre el
operando y ST. Si no se especifica parámetro se asume ST(1).
Actualiza los indicadores de punto flotante como sigue: Relación
C3, C2, C0 No
comparables 111 ST
> Fuente 000 ST
< Fuente 001 ST
= Fuente 100 FUCOMP
ST(i): Hace lo mismo que FUCOM ST(i)
y luego elimina el elemento que está en el tope de
la pila ST. FUCOMPP:
Hace lo mismo que FUCOM ST(1) y luego
retira los dos elementos de la pila. FPREM1:
Es similar al instrucción FPREM del coprocesador 8087,
pero cumple con la norma IEEE 754. Las
instrucciones FLENV y F[N]STENV necesitan ahora un
espacio de 18 bytes de memoria y FRSTOR y F[N]SAVE necesitan
98 bytes en memoria. Esto se debe a que las direcciones
que maneja el 80387 son de 32 bits (los anteriores
manejan direcciones de 16 bits). Instrucciones del 80486 BSWAP
reg32 (Byte Swap): Cambia el orden de
los bytes. Si antes de BSWAP el orden era B0, B1, B2, B3,
después de BSWAP el orden será B3, B2, B1, B0. CMPXCHG
dest, src (Compare and Exchange):
Compara el acumulador (AL o EAX) con dest.
Si es igual, dest se carga con el valor de src,
en caso contrario, el acumulador se carga con el valor de
dest. INVD
(Invalidate Cache): Vacía el caché interno.
Realiza un ciclo de bus especial que indica que deben
vaciarse los cachés externos. Los datos en el caché que
deben escribirse en la memoria se pierden. INVLPG
(Invalidate Translation Look-Aside Buffer Entry):
Invalida una entrada de página en el buffer de
conversión por búsqueda (TLB). Esta instrucción
puede ser implementada de forma diferente en
microprocesadores futuros. WBINVD
(Write Before Invalidate Data Cache): Realiza
los cambios indicados en el caché en la memoria externa
y luego lo invalida. XADD
dest, src (Exchange and Add):
Suma los operandos fuente y destino poniendo el resultado
en el destino. El valor original del destino se mueve a
la fuente. La instrucción cambia los indicadores de
acuerdo al resultado de la suma. Instrucciones del Pentium CMPXCHG8B
reg, mem64 (Compare and Exchange 8
Bytes): Compara el valor de 64 bits
ubicado en EDX:EAX con un valor de 64 bits situado en
memoria. Si son iguales, el valor en memoria se reemplaza
por el contenido de ECX:EBX y el indicador ZF se pone a
uno. En caso contrario, el valor en memoria se carga en
EDX:EAX y el indicador ZF se pone a cero. CPUID
(CPU Identification): Le informa al software
acerca del modelo de microprocesador en que está
ejecutando. Un valor cargado en EAX antes de ejecutar
esta instrucción indica qué información deberá
retornar CPUID. Si EAX = 0, se cargará en dicho registro
el máximo valor de EAX que se podrá utilizar en CPUID
(para el Pentium este valor es 1). Además, en la salida
aparece la cadena de identificación del fabricante
contenido en EBX, ECX y EDX. EBX contiene los primeros
cuatro caracteres, EDX los siguientes cuatro, y ECX los
últimos cuatro. Para los procesadores Intel la cadena es
"GenuineIntel". RDMSR
(Read from Model-Specific Register): El valor
en ECX especifica uno de los registros de 64 bits
específicos del modelo del procesador. El contenido de
ese registro se carga en EDX:EAX. EDX se carga con los 32
bits más significativos, mientras que EAX se carga con
los 32 bits menos significativos. RDTSC
(Read from Time Stamp Counter): Copia el
contenido del contador de tiempo (TSC) en EDX:EAX (el
Pentium mantiene un contador de 64 bits que se incrementa
por cada ciclo de reloj). Cuando el nivel de privilegio
actual es cero el estado del bit TSD en el registro de
control CR4 no afecta la operación de esta instrucción.
En los anillos 1, 2 ó 3, el TSC se puede leer sólo si
el bit TSD de CR4 vale cero. RSM
(Resume from System Management Mode): El
estado del procesador se restaura utilizando la copia que
se creó al entrar al modo de manejo del sistema (SMM).
Sin embargo, los contenidos de los registros específicos
del modelo no se afectan. El procesador sale del SMM y
retorna el control a la aplicación o sistema operativo
interrumpido. Si el procesador detecta alguna
información inválida, entra en el estado de apagado
(shutdown).
WRMSR (Write to Model-Specific Register): El valor en ECX especifica uno de los registros de 64 bits específicos del modelo del procesador. El contenido de EDX:EAX se carga en ese registro. EDX debe contener los 32 bits más significativos, mientras que EAX debe contener los 32 bits menos significativos. CONCLUSIONES Estas instrucciones son esenciales para la programacion incluso de la misma computadora, ademas de que todos los demas lenguajes esteructurados se basan en algunas de estas instrucciones y las tienen como base para poder relizar los programas. Estas son solo algunas de las instrucciones usadas por los procesadores de Intel y me pude dar cuenta que cada dia tratan de hacer mejoras para sacarle mas provecho a las computadoras asi como facilitarle y hacer mas agradable el uso de estas a los usuarios. REFERENCIAS http://www.sinergia-web.com.mx/clases/asm9708/Temas/clase07.htm htttp://www.intel.com |