Juego de instrucciones
Índice
- Introducción
- Objetivos
- 1.Juego de instrucciones
- 1.1.Ciclo de ejecución
- 1.2.Arquitectura del juego de instrucciones
- 1.3.Representación del juego de instrucciones
- 1.4.Formato de las instrucciones
- 1.5.Operandos
- 1.5.1.Número de operandos
- 1.5.2.Localización de los operandos
- 1.5.3.Tipo y tamaño de los operandos
- 1.6.Tipos de instrucciones
- 1.7.Diseño del juego de instrucciones
- 2.Modos de direccionamiento
- Resumen
Introducción
Objetivos
-
Saber cómo se define el juego de instrucciones de un procesador.
-
Conocer los tipos de instrucciones más habituales en el juego de instrucciones de un computador de propósito general.
-
Saber cómo funciona cada una de las instrucciones del juego de instrucciones.
-
Aprender las nociones básicas necesarias para utilizar un juego de instrucciones de bajo nivel.
-
Familiarizarse con las maneras de referenciar un dato en una instrucción.
1.Juego de instrucciones
1.1.Ciclo de ejecución
2) Lectura de los operandos fuente.
3) Ejecución de la instrucción y almacenamiento del operando destino.
4) Comprobación de interrupciones.
Inicio del ciclo de ejecución |
|
---|---|
Fase 1 Lectura de la instrucción |
Leer la instrucción. |
Descodificar la instrucción. |
|
Actualizar el PC. |
|
Fase 2 Lectura de los operandos fuente |
Calcular la dirección y leer el primer operando fuente. |
Calcular la dirección y leer el segundo operando fuente. |
|
Fase 3 Ejecución de la instrucción y almacenamiento del operando destino |
Ejecutar la instrucción. |
Fase 4 Comprobación de interrupciones |
Comprobar si algún dispositivo ha solicitado una interrupción. |
1.2.Arquitectura del juego de instrucciones
-
Arquitecturas basadas en pila: los operandos son implícitos y se encuentran en la pila.
-
Arquitecturas basadas en acumulador: uno de los operandos se encuentra de manera implícita en un registro denominado acumulador.
-
Arquitecturas basadas en registros de propósito general: los operandos se encuentran siempre de manera explícita, ya sea en registros de propósito general o en la memoria.
-
Registro-registro (o load-store). Solo pueden acceder a la memoria instrucciones de carga (load) y almacenamiento (store).
-
Registro-memoria. Cualquier instrucción puede acceder a la memoria con uno de sus operandos.
-
Memoria-memoria. Cualquier instrucción puede acceder a la memoria con todos sus operandos.
2) Acumulador
3) Registro-registro
4) Registro-memoria
5) Memoria-memoria
Pila |
Acumulador |
Registro-registro |
Registro-memoria |
Memoria-memoria |
---|---|---|---|---|
PUSH [A] |
LOAD [A] |
LOAD R1 [A] |
MOV R1 [A] |
MOV [C] [A] |
PUSH [B] |
ADD [B] |
LOAD R2, [B] |
ADD R1, [B] |
ADD [C], [B] |
ADD |
STORE [C] |
ADD R2, R1 |
MOV [C], R1 |
|
POP [C] |
STORE [C], R2 |
1.3.Representación del juego de instrucciones
Arquitectura |
Instrucción |
Operación |
---|---|---|
CISCA |
ADD R1, R2 |
Suma |
Intel x86-64 |
MUL RAX |
Multiplicación |
MIPS |
lw $S1, 100($S2) |
Carga en un registro el valor almacenado en una posición de memoria |
Código de operación |
Operando 1 |
Operando 2 |
---|---|---|
ADD |
R1 |
R2 |
Código de operación |
Operando 1 |
Operando 2 |
---|---|---|
20h |
11h |
12h |
0010 0000 |
0001 0001 |
0001 0010 |
8 bits |
8 bits |
8 bits |
← 24 bits → |
1.4.Formato de las instrucciones
1.4.1.Elementos que componen una instrucción
-
Código de operación: especifica la operación que hace la instrucción.
-
Operando fuente: para hacer la operación pueden ser necesarios uno o más operandos fuente; uno o más de estos operandos pueden ser implícitos.
-
Operando destino: almacena el resultado de la operación realizada. Puede estar explícito o implícito. Uno de los operandos fuente se puede utilizar también como operando destino.
-
Dirección de la instrucción siguiente: especifica dónde está la instrucción siguiente que se debe ejecutar; suele ser una información implícita, ya que el procesador va a buscar automáticamente la instrucción que se encuentra a continuación de la última instrucción ejecutada. Solo las instrucciones de ruptura de secuencia especifican una dirección alternativa.
1.4.2.Tamaño de las instrucciones
-
Instrucciones de tamaño fijo: todas las instrucciones ocuparán el mismo número de bits. Esta alternativa simplifica el diseño del procesador y la ejecución de las instrucciones puede ser más rápida.
-
Instrucciones de tamaño variable: el tamaño de las instrucciones dependerá del número de bits necesario para cada una. Esta alternativa permite diseñar un conjunto amplio de códigos de operación, el direccionamiento puede ser más flexible y permite poner referencias a registros y memoria. Como contrapartida, aumenta la complejidad del procesador.
Códigos de operación de 3 bits |
Códigos de operación con expansión del código |
||
000 |
100 00 |
||
000 |
001 |
100 01 |
|
001 |
010 00 |
100 10 |
|
010 |
010 01 |
100 11 |
|
011 |
010 10 |
101 00 |
|
100 |
010 11 |
101 01 |
|
101 |
011 00 |
101 10 |
|
110 |
011 01 |
101 11 |
|
111 |
011 10 |
110 |
|
011 11 |
111 |
-
El número de operandos puede ser 0, 1 o 2 y de tamaño variable.
-
No puede haber dos operandos que hagan referencia a memoria.
-
Dispone de un banco de 16 registros.
-
Memoria de 232 direcciones de tipo byte (4 Gbytes). Necesitamos 32 bits para codificar las direcciones.
-
Los desplazamientos se codifican utilizando 16 bits.
-
Los valores inmediatos se codifican utilizando 32 bits.
1.5.Operandos
1.5.1.Número de operandos
-
En una arquitectura basada en pila, los dos operandos fuente se encontrarán en la cima de la pila y el resultado se almacenará también en la pila.
-
En una arquitectura basada en acumulador, uno de los operandos fuente se encontrará en el registro acumulador, el otro estará explícito en la instrucción y el resultado se almacenará en el acumulador.
-
En una arquitectura basada en registros de propósito general, los dos operandos fuente estarán explícitos. El operando destino podrá ser uno de los operandos fuente (instrucciones de dos operandos) o un operando diferente (instrucciones de tres operandos).
Pila |
ADD |
Suma los dos valores de encima de la pila |
Acumulador |
ADD R1 |
Acumulador = Acumulador + R1 |
Registro-registro |
ADD R1, R2 |
R1 = R1 + R2 |
ADD R3, R1, R2 |
R3 = R1 + R2 |
|
Registro-memoria |
ADD R1, [A01Bh] |
R1 = R1+ M(A01Bh) |
ADD R2, R1, [A01Bh] |
R2 = R1+ M(A01Bh) |
|
Memoria-memoria |
ADD [A01Dh], [A01Bh] |
M(A01Dh) = M(A01Dh) + M(A01Bh) |
1.5.2.Localización de los operandos
-
Inmediato. El dato está representado en la instrucción misma. Podemos considerar que se encuentra en un registro, el registro IR (registro de instrucción), y está directamente disponible para el procesador.
-
Registro. El dato estará directamente disponible en un registro dentro del procesador.
-
Memoria. El procesador deberá iniciar un ciclo de lectura/escritura a memoria.
1.5.3.Tipo y tamaño de los operandos
Forma de expresarlo |
Forma de codificarlo con 8 bits |
||
En decimal |
En hexadecimal |
Entero sin signo |
Entero con signo en Ca2 |
12 |
0Ch |
0000 1100 |
0000 1100 |
-33 |
DFh |
No se puede (tiene signo) |
1101 1111 |
150 |
96h |
1001 0110 |
No se puede |
1.6.Tipos de instrucciones
-
Transferencia de datos
-
Aritméticas
-
Lógicas
-
Transferencia del control
-
Entrada/salida
-
Otros tipos
1.6.1.Bits de resultado
-
Bit de cero (Z): se activa si el resultado obtenido es 0.
-
Bit de transporte (C): también denominado carry en la suma y borrow en la resta. Se activa si en el último bit que operamos en una operación aritmética se produce transporte, también se puede deber a una operación de desplazamiento. Se activa si al final de la operación nos llevamos una según el algoritmo de suma y resta tradicional operando en binario o si el último bit que desplazamos se copia sobre el bit de transporte y este es 1.
Cuando operamos con números enteros sin signo, el bit de transporte es equivalente al bit de desbordamiento; pero con número con signo (como es el caso del Ca2), el bit de transporte y el bit de desbordamiento no son equivalentes y la información que aporta el bit de transporte sobre el resultado no es relevante.
Bit de transporte en la restaEl bit de transporte, también denominado borrow, se genera según el algoritmo convencional de la resta. Pero si para hacer la resta A – B, lo hacemos sumando el complementario del sustraendo, A + (–B), el bit de transporte de la resta (borrow) será el bit de transporte (carry) negado obtenido de hacer la suma con el complementario (borrow = carry negado), salvo los casos en los que B = 0, donde tanto el carry como el borrow son iguales y valen 0.
-
Bit de desbordamiento (V): también denominado overflow. Se activa si la última operación ha producido desbordamiento según el rango de representación utilizado. Para representar el resultado obtenido, en el formato que estamos utilizando, necesitaríamos más bits de los disponibles.
-
Bit de signo (S): activo si el resultado obtenido es negativo, el bit más significativo del resultado es 1.
1.6.2.Instrucciones de transferencia de datos
STORB [1000], 020h: Indica que transferimos 1 byte a la posición de memoria 1000.
STORW [1000], R1: Indica que transferimos 2 bytes (1 word), el contenido del registro R1, a las posiciones de memoria 1000 y 1001.
Instrucción |
Ejemplo |
Operación |
---|---|---|
LOAD destino, fuente |
LW $s1,100($s2) |
Mueve el contenido de la posición de memoria M($s2+100) al registro $s1 |
STORE fuente, destino |
SW $s1,100($s2) |
Mueve el contenido del registro $s1 a la posición de memoria M($s2+100) |
MOVE destino, fuente |
MOVE $s1,$s2 |
Mueve el contenido del registro $s2 al registro $s1 |
Instrucción |
Operación |
Ejemplo |
---|---|---|
MOV destino, fuente |
destino ← fuente |
MOV RAX, [num_var] |
XCHG destino, fuente |
destino ← → fuente Intercambia el contenido de los dos operandos. |
XCHG [num_var], RBX |
POP destino |
destino ← M(SP), actualiza SP. Saca el valor que hay en la cima de la pila. |
POP RAX |
Instrucción |
Operación |
Ejemplo |
---|---|---|
MOV destino, fuente |
destino ← fuente |
MOV R1, [nom_var] |
PUSH fuente |
Actualiza SP, M(SP) ← fuente. Pone el valor en la cima de la pila. |
PUSH R5 |
1.6.3.Instrucciones aritméticas
Suma y resta
Instrucción |
Operación |
Ejemplo |
---|---|---|
ADD destino, fuente |
destino = destino + fuente |
ADD R1, R2 |
SUB destino, fuente |
destino = destino – fuente |
SUB R1, R2 |
Instrucción |
Operación |
Ejemplo |
---|---|---|
ADC destino, fuente |
destino = destino + fuente + bit de transporte |
ADC RAX, RBX |
SBB destino, fuente |
destino = destino – fuente – bit de transporte |
SBB RAX, RBX |
Multiplicación
-
Si el operando fuente es de 8 bits, la operación que se hace es AX = AL * fuente, que amplía el resultado a un valor de 16 bits.
-
Si el operando fuente es de 16 bits, la operación que se hace es DX,AX = AX * fuente, que amplía el resultado a un valor de 32 bits.
-
Si el operando fuente es de 32 bits, la operación que se hace es EDX,EAX = EAX * fuente, que amplía el resultado a un valor de 64 bits.
-
Si el operando fuente es de 64 bits, la operación que se hace es RDX,RAX = RAX * fuente, que amplía el resultado a un valor de 128 bits.
Instrucción |
Ejemplo |
Operación |
---|---|---|
MUL fuente (operación sin considerar el signo, un operando implícito) |
MUL RBX |
RDX,RAX = RAX * RBX |
IMUL fuente (operación considerando el signo, un operando implícito) |
IMUL BL |
AX = AL * BL |
IMUL destino, fuente (operación considerando el signo, dos operandos explícitos) |
IMUL EAX, EBX |
EAX = EAX * EBX |
Instrucción |
Operación |
Ejemplo |
---|---|---|
MUL destino, fuente |
destino = destino * fuente |
MUL R1, R2 |
División
-
Operando fuente de 8 bits: (cociente) AL = AX / fuente, (residuo) AH = AX mod fuente
-
Operando fuente de 16 bits: (cociente) AX = DX:AX / fuente, (residuo) DX = DX:AX mod fuente
-
Operando fuente de 32 bits: (cociente) EAX = EDX:EAX / fuente, (residuo) EDX = EDX:EAX mod fuente
-
Operando fuente de 64 bits: (cociente) RAX = RDX:RAX / fuente, (residuo) RDX = RDX:RAX mod fuente
Instrucción |
Ejemplo |
Operación |
---|---|---|
DIV fuente (operación sin considerar el signo) |
DIV RBX |
RAX = RDX:RAX / RBX RDX = RDX:RAX mod RBX |
IDIV fuente (operación considerando el signo) |
IDIV EBX |
EAX = EDX:EAX / EBX EDX = EDX:EAX mod EBX |
Instrucción |
Ejemplo |
Operación |
---|---|---|
DIV destino, fuente DIV (dividendo/cociente), (divisor/residuo) |
DIV R1, R2 |
R1 = R1 / R2 (cociente) R2 = R1 mod R2 (residuo) |
Incremento y decremento
Instrucción |
Operación |
Ejemplo |
---|---|---|
INC destino |
destino = destino + 1 |
INC RAX |
DEC destino |
destino = destino – 1 |
DEC BL |
Instrucción |
Operación |
Ejemplo |
---|---|---|
INC destino |
destino = destino + 1 |
INC R3 |
DEC destino |
destino = destino – 1 |
DEC R5 |
Comparación
Instrucción |
Operación |
Ejemplo |
---|---|---|
CMP destino, fuente |
destino – fuente |
CMP RAX, RBX |
Instrucción |
Operación |
Ejemplo |
---|---|---|
CMP destino, fuente |
destino – fuente |
CMP R1,R2 |
Negación
Instrucción |
Operación |
Ejemplo |
---|---|---|
NEG destino |
destino = NOT(destino) + 1 |
NEG EAX |
Instrucción |
Operación |
Ejemplo |
---|---|---|
NEG destino |
destino = NOT(destino) + 1 |
NEG R7 |
Instrucción |
Z |
S |
C |
V |
---|---|---|---|---|
Suma |
x |
x |
x |
x |
Resta |
x |
x |
x |
x |
Multiplicación |
x |
x |
- |
x |
División |
x |
x |
- |
x |
Incremento |
x |
x |
x |
x |
Decremento |
x |
x |
x |
x |
Comparación |
x |
x |
x |
x |
Negación |
x |
x |
x |
x |
1.6.4.Instrucciones lógicas
x |
y |
x AND y |
x OR y |
x XOR y |
NOT x |
---|---|---|---|---|---|
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
-
Cuando se rota a la derecha, el bit menos significativo del operando se copia sobre el bit de transporte y el bit de transporte original se copia sobre el bit más significativo del operando.
-
Cuando se rota a la izquierda, el bit más significativo del operando se copia sobre el bit de transporte y el bit de transporte se copia sobre el bit menos significativo.
Instrucción |
Z |
S |
C |
V |
---|---|---|---|---|
AND |
x |
x |
0 |
0 |
OR |
x |
x |
0 |
0 |
XOR |
x |
x |
0 |
0 |
NOT |
– |
– |
– |
– |
Desplazamientos lógicos |
x |
x |
x |
0 |
Desplazamientos aritméticos |
x |
x |
x |
x |
Rotaciones |
– |
– |
x |
x |
Instrucción |
Operación |
Ejemplo |
---|---|---|
AND destino, fuente |
destino = fuente AND destino |
AND AL,BL |
OR destino, fuente |
destino = fuente OR destino |
OR RAX,RBX |
SHL destino, fuente |
destino = destino * 2fuente (considerando destino como un valor sin signo) |
SHL AL, 4 |
SHR destino, fuente |
destino = destino / 2fuente (considerando destino como un valor sin signo) |
SHR RAX, CL |
RCL destino, fuente |
(CF = bit más significativo de destino, destino = destino * 2 + CForiginal) haremos eso tantas veces como indique el operando fuente. |
RCL EAX, CL |
RCR destino, fuente |
(CF = bit menos significativo de destino, destino = destino / 2 + CForiginal) haremos eso tantas veces como indique el operando fuente. |
RCR RBX, 1 |
Instrucción |
Operación |
Ejemplo |
---|---|---|
XOR destino, fuente |
destino = fuente XOR destino |
XOR R2,R7 |
NOT destino |
destino negado bit a bit |
NOT R3 |
SAL destino, fuente |
destino = destino * 2fuente |
SAL R9, 3 |
SAR destino, fuente |
destino = destino / 2fuente |
SAR R9, 2 |
1.6.5.Instrucciones de ruptura de secuencia
-
Instrucciones de salto o bifurcación.
-
Instrucciones de salto incondicional.
-
Instrucciones de salto condicional.
-
-
Instrucciones de llamada y retorno de subrutina.
-
Instrucciones de interrupción de software y retorno de una rutina de servicio de interrupción.
Instrucciones de salto incondicional
Instrucción |
Operación |
Ejemplo |
---|---|---|
JMP etiqueta |
[PC] ← etiqueta Salta a la instrucción indicada por la etiqueta |
JMP bucle |
bucle: MOV R0, R1 ; Esto es un bucle infinito JMP bucle MOV R2, 0 ; No se ejecuta nunca
Instrucciones de salto condicional
Condición |
Bits que comprueba con operandos sin signo |
Bits que comprueba con operandos con signo |
---|---|---|
A = B |
Z = 1 |
Z = 1 |
A ≠ B |
Z = 0 |
Z = 0 |
A > B |
C = 0 y Z = 0 |
Z = 0 y S = V |
A ≥ B |
C = 0 |
S = V |
A < B |
C = 1 |
S ≠ V |
A ≤ B |
C = 1 o Z = 1 |
Z = 1 o S ≠ V |
Instrucción |
Operación |
Ejemplo |
---|---|---|
JE etiqueta (Jump Equal – Salta si igual) |
Salta si Z = 1 |
JE eti3 |
JNE etiqueta (Jump Not Equal – Salta si diferente) |
Salta si Z = 0 |
JNE eti3 |
JG etiqueta (Jump Greater – Salta si mayor) |
Salta si Z = 0 y S = V (operandos con signo) |
JG eti3 |
JGE etiqueta (Jump Greater or Equal – Salta si mayor o igual) |
Salta si S = V (operandos con signo) |
JGE eti3 |
JL etiqueta (Jump Less – Salta si más pequeño) |
Salta si S≠ V (operandos con signo) |
JL eti3 |
JLE etiqueta (Jump Less or Equal – Salta si más pequeño o igual) |
Salta si Z = 1 o S ≠ V (operandos con signo) |
JLE eti3 |
MOV R2, 0 eti3: INC R2 ; Esto es un bucle de 3 iteraciones CMP R2, 3 JL eti3 MOV R2, 7
Instrucción |
Operación |
Ejemplo |
---|---|---|
JA etiqueta (Jump Above – Salta si superior) |
Salta si C = 0 y Z = 0 (operandos sin signo) |
JA bucle |
JAE etiqueta (Jump Above or Equal – Salta si superior o igual) |
Salta si C = 0 (operandos sin signo) |
JAE bucle |
JB etiqueta (Jump Below – Salta si inferior) |
Salta si C = 1 (operandos sin signo) |
JB bucle |
JBE etiqueta (Jump Below or Equal – Salta si inferior o igual) |
Salta si C = 1 o Z = 1 (operandos sin signo) |
JBE bucle |
JV etiqueta |
Salta si V = 1 |
JV bucle |
iteracion: ... DSZ R1 JMP iteración continuar: ...
Instrucciones de llamada y retorno de subrutina
Instrucción |
Operación |
Ejemplo |
---|---|---|
CALL etiqueta |
Transfiere el control a la subrutina. |
CALL subrutina |
RET |
Retorna de la subrutina |
RET |
CALL 'nom_subrutina' |
RET |
||
SP = SP – 4 |
PC = M(SP) |
||
M(SP) = PC |
SP = SP + 4 |
||
PC = Dirección inicio 'nombre-subrutina' |
Instrucciones de interrupción de software y retorno de una rutina de servicio de interrupción
Instrucción |
Operación |
Ejemplo |
---|---|---|
INT servicio |
Llamada al sistema |
INT 80 h |
Instrucción |
Operación |
Ejemplo |
---|---|---|
INT servicio |
Llamada al sistema |
INT 1 h |
Instrucción |
Operación |
Ejemplo |
---|---|---|
IRET |
Retorno de una rutina de servicio de interrupción |
IRET |
1.6.6.Instrucciones de entrada/salida
-
Mapa común de memoria y E/S: se utilizan las mismas instrucciones de transferencia de datos explicados anteriormente.
-
Mapa independiente de E/S: las instrucciones utilizadas para acceder a los puertos de E/S son diferentes de las de transferencia de datos. Las más habituales son:
-
IN. Permite leer de un puerto de E/S. Utiliza dos operandos: un número de puerto y una localización para almacenar el valor leído (normalmente un registro).
-
OUT. Permite escribir en un puerto de E/S. Utiliza dos operandos: un número de puerto y la localización del valor que se debe escribir en el puerto, habitualmente este valor se encuentra en un registro.
-
Instrucción |
Operación |
Ejemplo |
---|---|---|
IN destino, fuente |
destino ← puerto de E/S indicado por el operando fuente |
IN AX, 20h |
OUT destino, fuente |
puerto de E/S indicado por el operando destino ← fuente |
OUT 20h, EAX |
Instrucción |
Operación |
Ejemplo |
---|---|---|
IN destino, fuente |
destino ← puerto de E/S indicado por el operando fuente |
IN R5, 01h |
OUT destino, fuente |
puerto de E/S indicado por el operando destino ← fuente |
OUT 02h, R8 |
1.6.7.Otros tipos de instrucciones
1.7.Diseño del juego de instrucciones
-
Conjunto de operaciones: identificación de las operaciones que hay que llevar a cabo y su complejidad.
-
Tipos de datos: identificación de los tipos de datos necesarios para llevar a cabo las operaciones.
-
Registros: identificación del número de registros del procesador.
-
Direccionamiento: identificación de los modos de direccionamiento que se pueden utilizar en los operandos.
-
Formato de las instrucciones: longitud y número de operandos, y tamaño de los diferentes campos.
2.Modos de direccionamiento
-
El rango de las direcciones que hemos de alcanzar para poder acceder a todo el espacio de memoria dirigible con respecto a programación.
-
Con respecto al espacio para expresar el operando, se intentará reducir el número de bits que hay que utilizar para codificar el operando y, en general, las diferentes partes de la instrucción para poder construir programas que ocupen menos memoria.
-
Las estructuras de datos en las que se pretenda facilitar el acceso o la manera de operar, como listas, vectores, tablas, matrices o colas.
-
La complejidad de cálculo de la dirección efectiva que expresa el operando para agilizar la ejecución de las instrucciones.
-
Direccionamiento inmediato
-
Direccionamiento directo:
-
Direccionamiento directo a registro
-
Direccionamiento directo a memoria
-
-
Direccionamiento indirecto:
-
Direccionamiento indirecto a registro
-
Direccionamiento indirecto a memoria
-
-
Direccionamiento relativo:
-
Direccionamiento relativo a registro base o relativo
-
Direccionamiento relativo a registro índice (RI) o indexado
-
Direccionamiento relativo a PC
-
-
Direccionamiento implícito
-
Direccionamiento a pila (indirecto a registro SP)
-
-
little-endian: almacenar el byte de menos peso del dato en la dirección de memoria más baja.
-
big-endian: almacenar el byte de más peso del dato en la dirección de memoria más baja.
Little-endian |
Big-endian |
||
---|---|---|---|
Dirección |
Contenido |
Dirección |
Contenido |
200h |
78h |
200h |
12h |
201h |
56h |
201h |
34h |
202h |
34h |
202h |
56h |
203h |
12h |
203h |
78h |
2.1.Direccionamiento inmediato
2.2.Direccionamiento directo
2.3.Direccionamiento indirecto
2.4.Direccionamiento relativo
2.4.1.Direccionamiento relativo a registro base
2.4.2.Direccionamiento relativo a registro índice
2.4.3.Direccionamiento relativo a PC
Memoria |
||
Dirección |
Etiqueta |
Instrucción |
0001 1000h |
MOV R0,0 |
|
0001 1007h |
bucle: |
ADD R0,1 |
0001 100Eh |
CMP R0,8 |
|
0001 1015h |
JE bucle |
|
0001 1019h |
MOV R0,–1 |
2.5.Direccionamiento implícito
2.5.1.Direccionamiento a pila
Crece hacia direcciones más pequeñas (preautodecremento) |
Crece hacia direcciones mayores (preautoincremento) |
SP = SP – 2 M[ SP] = X |
SP = SP + 2 M[ SP] = X |
Crece hacia direcciones más pequeñas (postautoincremento) |
Crece hacia direcciones mayores (postautodecremento) |
X = M[ SP] SP = SP + 2 |
X = M[ SP] SP = SP – 2 |
Resumen
-
El punto de vista del programador, que denominamos lenguaje de ensamblador.
-
El punto de vista del computador, que denominamos lenguaje de máquina.
-
Los elementos que componen la instrucción: código de operación, operandos fuente, operando destino y dirección de la instrucción siguiente.
-
El tamaño de las instrucciones, que puede ser fijo o variable, y cómo determinar el tamaño de los diferentes campos.
Tipos de instrucciones |
Ejemplos |
|
Instrucciones de transferencia de datos |
MOV AL, 0 |
|
MOV R1, R2 |
||
Instrucciones aritméticas |
Suma |
ADD R1, R2 |
Resta |
SUB R1, 2 |
|
Multiplicación |
MUL R1, R2 |
|
División |
DIV R2, R3 |
|
Incremento |
INC RAX |
|
Decremento |
DEC RAX |
|
Comparación |
CMP RAX, RBX |
|
Negación |
NEG RAX |
|
Instrucciones lógicas |
AND |
AND R1, 1 |
OR |
OR R1, R2 |
|
XOR |
XOR R1, R2 |
|
NOT |
NOT R1 |
|
Desplazamiento lógico a la izquierda |
SHL RAX, 1 |
|
Desplazamiento lógico a la derecha |
SHR RAX, 1 |
|
Desplazamiento aritmético a la izquierda |
SAL RAX, 1 |
|
Desplazamiento aritmético a la derecha |
SAR RAX, 1 |
|
Rotación a la izquierda |
ROL RAX, 1 |
|
Rotación a la derecha |
ROR RAX, 1 |
|
Instrucciones de ruptura de secuencia |
Salto incondicional |
JMP etiqueta |
Salto condicional |
JE etiqueta |
|
Instrucciones de llamada y retorno de subrutina |
CALL etiqueta |
|
Instrucciones de interrupción de software |
INT 80h |
|
Instrucciones de retorno de interrupción |
IRET |
|
Instrucciones de entrada/salida |
Entrada |
IN AL, 20h |
Salida |
OUT 20h, AL |
|
Otros tipos de instrucciones |
NOP |
Direccionamiento |
Sintaxis |
Que expresa OP |
Cómo obtenemos |
Cómo obtenemos |
Observaciones |
---|---|---|---|---|---|
Inmediato |
Valor |
OP = Dato |
Dato = OP |
||
Directo a registro |
R |
OP = R |
Dato = R |
||
Directo a memoria |
[A] |
OP = A |
AE = A |
Dato = M[A] |
|
Indirecto a registro |
[R] |
OP = R |
AE = R |
Dato = M[R] |
|
Indirecto a memoria |
[[A]] |
OP = A |
AE = M[A] |
Dato = M[ M[A]] |
|
Relativo a RB |
[RB + Desp.] |
OP = RB + Desp. |
AE = RB + Desp. |
Dato = M[ RB + Desp.] |
|
Relativo a RI |
[A + RI] |
OP = EN + RI |
AE = EN + RI |
Dato = M[ EN + RI] |
Con preautoincremento o postautoincremento RI = RI ± 1 |
Relativo a PC |
A |
OP = Desp. |
Dato = PC + Desp. |
PC es implícito y Dato es la dirección de la instrucción siguiente por ejecutar. |
|
A pila |
Valor o R o A |
OP = Dato o R o A |
AE = SP |
Dato = M[SP] |
Direccionamiento implícito |