domingo, 19 de enero de 2014

Anexo 4: Conjunto básico de instrucciones Intel

Claves:

  () = contenidos
   r = registro,
   M = domicilio de la memoria definido por el bit alto H y el bit bajo L


Conjunto de instrucciones básicas Intel para procesadores x86

Mnemónica Código Op
D7D6D5D4D3D2D1D0
Significado
MOV r1, r2 01DD DSSS
Mover los contenidos del registro
r1 al registro r2
r1 ← (r2): transferir r2 a r1
MOV M, r 0111 0SSS
Mover los contenidos del registro r
a la memoria
MOV r, M 01DD D110
Mover contenidos de la memoria
al registro r
HLT 0111 0110
Alto (Halt)
MVI r, dato 00DD D110
Movimiento inmediato de dato  al
registro r
MVI M, dato 0011 0110
Movimiento inmediato de dato  a
la memoria
INR r 00DD D100
Incrementar los contenidos del
registro r en 1
r ← r + 1
DCR r 00DD D101
Decrementar contenidos del
registro r en 1
r ← r - 1
ADD r 1000 0SSS
Sumar (Add) los contenidos del
registro r al acumulador A
A ← (A) + (r)
ADC r 1000 1SSS
Sumar (Add) el registro r con
“llevar” (Carry) a A
(Add with Carry)
A ← (A) + (r) + C
SUB r 1001 0SSS
Restar (Subtract) el registro r del
acumulador A
A ← (A) - (r)
SBB r 1001 1SSS
Restar el registro r del acumulador
A con “tomar prestado”
(Subtract with Borrow)
ANA r 1010 0SSS
Operación AND del registro r con
el acumulador A
A ← (A) AND (R)
XRA r 1010 1SSS
Operación OR EXCLUSIVO del
registro con el acumulador A
A ← (A) XOR (R)
ORA r 1011 0SSS
Operación OR del registro r con
el acumulador A
A ← (A) OR (R)
CMP r 1011 1SSS
Comparar los contenidos del
registro r con el acumulador A
ADD M 1000 0110
Sumar de la memoria al
acumulador A
ADC M 1000 1110
Sumar de la memoria al
acumulador A con “llevar” (Carry)
SBB M 1001 1110
Restar número en la memoria del
acumulador con “tomar prestado”
ANA M 1010 0110
Operación AND del número en
la memoria con el acumulador A
XRA M 1010 1110
OR EXCLUSIVO del número en
la memoria con el acumulador A
ORA M 1011 0110
Operación OR del número en la
memoria con el acumulador A
CMP M 1011 1110
Comparar número en la memoria
con el acumulador A
ADI dato 1100 0110
Suma Inmediato (Add Immediate)
al acumulador A
ACI dato 1100 1110
Suma Inmediato (Add Immediate)
al acumulador A con “llevar”
SUI dato 1101 0110
Resta Inmediato (Subtract
Immediate) del acumulador
SBI dato 1101 1110
Resta Inmediato del acumulador A
con “tomar prestado” (Borrow)
ANI dato 1110 0110 And Inmediato (AND Immediate)
con los contenidos del acumulador
XRI dato 1110 1110
OR EXCLUSIVO  Inmediato
con los contenidos del acumulador
ORI dato 1111 0110
OR Inmediato con los contenidos
del acumulador
CPI dato 1111 1110
Comparación Inmediato con los
contenidos del acumulador A
RLC 0000 0111
Rotar los contenidos del acumulador
hacia la izquierda (Left)
RRC 0000 1111
Rotar los contenidos del acumulador
hacia la derecha (Right)
RAL 0001 0111
Rotar A hacia la izquierda (Left)
a través de  “llevar”
RAR 0001 1111
Rotar A hacia la derecha (Right)
a través de  “llevar”
JMP domicilio 1100 0011
Salto incondicional (Jump)
JC dom. cond. 1101 1010
Salto en la condición de “llevar”
(Jump on Carry)
JNC dom. cond. 1101 0010
Salto en la condición de “no llevar”
(Jump on No Carry)
JZ dom. cond. 1100 1010
Salto en la condición de cero (Jump
on Zero)
JNZ dom. cond. 1100 0010
Salto en la condición de no-cero
(Jump on No Zero)
JP dom. cond. 1111 0010
Salto en la condición de positivo
(Jump on Positive)
JM dom. cond. 1111 1010
Salto en la condición de negativo
(Jump on Minus)
JPE dom. cond. 1110 1010
Salto en la condición de paridad par
(Jump on Parity Even)
JPO dom. cond. 1110 0010
Salto en la condición de paridad
impar (Jump on Parity Odd)
CALL domicilio 1100 1101
Llamado incondicional (Call
unconditional)
CC dom. cond. 1101 1100
Llamado en la condición de “llevar”
(Call on Carry)
CNC dom. cond. 1101 0100
Llamado en la condición de “no
llevar” (Call on No Carry)
CZ dom. cond. 1100 1100
Llamado en la condición de cero
(Call on Zero)
CNZ dom. cond. 1100 0100
Llamado en la condición de no-cero
(Call on No Zero)
CP dom. cond. 1111 0100
Llamado en la condición de positivo
(Call on Positive)
CM dom. cond. 1111 1100
Llamado en la condición de negativo
(Call on Minus)
CPE dom. cond. 1110 1100
Llamado en la condición de paridad
par (Call on Parity Even)
CPO dom. cond. 1110 0100
Llamado en la condición de paridad
impar (Call on Parity Odd)
RTE 1100 1001
Regresar (Return)
RC 1101 1000
Regresar en la condición de “llevar”
(Return on Carry)
RNC 1101 0000
Regresar en la condición de “no
llevar” (Return on No Carry)
RZ 1100 1000
Regresar en la condición de cero
(Return on Zero)
RNZ 1100 0000
Llamado en la condición de no-cero
(Return on No Zero)
RP 1111 0000
Regresar en la condición de positivo
(Return on Positive)
RM 1111 1000
Regresar en la condición de negativo
(Return on Minus)
RPE 1110 1000
Regresar en la condición de paridad
par (Return on Parity Even)
RPO 1110 0000
Regresar en la condición de paridad
impar (Return on Parity Odd)
RST n 11NN N111
Reiniciar (Restart)
IN puerto 1101 1011
Entrada (Input) a un puerto
OUT puerto 1101 0011
Salida (Output) a un puerto
LXI B dato 0000 0001
Carga Inmediato par de registros B
y C (Load Immediate register pair
B & C)
LXI D dato 0001 0001
Carga Inmediato par de registros D
y E (Load Immediate register pair
D & E)
LXH dato 0010 0001
Carga Inmediato par de registros H
y L (Load Immediate register pair
H & L)
PUSH B 1100 0101
Empujar (Push)  par de registros B y
C hacia la pila
PUSH D 1101 0101
Empujar (Push)  par de registros D y
E hacia la pila
PUSH H 1110 0101
Empujar (Push)  par de registros H y
L hacia la pila
PUSH PSW 1111 0101
Empujar contenidos del acumulador
y las banderas hacia la pila
POP B 1100 0001
Botar de la pila el par de registros B
y C (Pop register pair off the stack)
POP D 1101 0001
Botar de la pila el par de registros D
y E (Pop register pair off the stack)
POP H 1110 0001
Botar de la pila el par de registros H
y L (Pop register pair off the stack)
POP PSW 1111 0001
Botar contenidos (acumulador y
banderas guardados) de la pila
STA domicilio 0011 0010
Almacenamiento directo de lo que
está en A (Store A direct)
LDA domicilio 0011 1010
Cargado directo de lo que está en
el acumulador A (Load A direct)
XCHG 1110 1011
Intercambiar el par de registros D y
E con el par de registros H y L
(Exchange register pairs)
XTHL 1110 0011
Intercambiar tope de la pila con los
registros H y L
(Exchange Top of stack with HL)
SPHL 1111 1001
Enviar el par de registros H y L al
tope de la pila
(Stack Push of H and L pair)
PCHL 1110 1001
Enviar el par de registros H y L al
Contador del Programa
DAD B 0000 1001
Sumar (Add) el par de registros B y
C al par de registros H y L
DAD D 0001 1001
Sumar (Add) el par de registros D y
E al par de registros H y L
DAD H 0010 1001
Sumar (Add) el par de registros H y
L al mismo par de registros H y L
STAX B 0000 0010
Almacenamiento (Store) indirecto
de A en el par de registros B y C
STAX D 0001 0010
Almacenamiento (Store) indirecto
de A en el par de registros D y E
LDAX B 0000 1010
Cargado (Load) indirecto de A del
par de registros B y C
LDAX D 0001 1010
Cargado (Load) indirecto de A del
par de registros D y E
INX B 0000 0011
Incrementar el par de registros B y
C (tomados como un solo registro)
INX D 0001 0011
Incrementar el par de registros D y
E (tomados como un solo registro)
INX H 0010 0011
Incrementar el par de registros H y
L (tomados como un solo registro)
INX SP 0011 0011
Incrementar el puntero que apunta
hacia la pila (Increment Stack
Pointer)
DCX B 0000 1011
Decrementar el par de registros B y
C (tomados como un solo registro)
DCX D 0001 1011
Decrementar el par de registros D y
E (tomados como un solo registro)
DCX H 0010 1011
Decrementar el par de registros H y
L (tomados como un solo registro)
DCX SP 0011 1011
Decrementar el puntero que apunta
hacia la pila (Decrement Stack
Pointer)
CMA 0010 1111
Complementar (lógicamente) los
contenidos del acumulador A
STC 0011 0111
Fijar en “1” (Set) la bandera de
la condición de “llevar”
(Set Carry)
CMC 0011 1111
Complementar (lógicamente) la
bandera de la condición de “llevar”
(Complement Carry)
DAA 0010 0111
Ajuste decimal (Decimal Adjust) del
acumulador A
SHLD domicilio 0010 0010
Almacenar (Store) en forma directa
el par de registros H y L
LHLD domicilio 0010 1010
Cargar (Load) en forma directa al
par de registros H y L
EI 1111 1011
Habilitar interrupciones (Enable
Interrupts)
DI 1111 0011
Inhabilitar interrupciones (Disable
Interrupts)
NOP 0000 0000
No operación (instrucción a ser
ignorada por el procesador)


Notas:

1) En la tabla, las siglas SSS y DDD identifican al registro fuente de origen SSS (Source) y al registro destinatario DDD (Destination) de acuerdo al siguiente convención:

SSS ó DDD Valor
A 111
B 000
C 001
D 010
E 011
H 100
L 101


2) Cada uno de los saltos J (como JNZ y JPE) puede ser obtenido agregando al símbolo J el sufijo adecuado (NZ, PE, etc.) y formando la instrucción (JNZ, JPE, etc.) en lenguaje de máquina usando el formato:

11CC C010


y reemplazando los valores CCC de acuerdo a la siguiente tabla:

Condición CCC
NZ (No Zero, Z=0) 000
Z (Zero, Z=1) 001
NC (No Carry, CY=0) 010
C (Carry, CY=1) 011
PO (Parity Odd, P=0) 100
PE (Parity Even, P=1) 101
P (Plus, S=0) 110
M (Minus, S=1) 111


Las instrucciones de llamados (Call) y los regresos (Return) que empiezan con C y con R respectivamente usan la misma convención y la información se puede compactar de la misma manera.

En la literatura técnica de Intel frecuentemente se usa la notación simbólica compacta, pero se ha optado aquí por expanderla en forma explícita en aras de una mayor claridad.