La arquitectura CISCA
Índice
- Introducción
- Objetivos
- 1.Organización del computador
- 2.Juego de instrucciones
- 2.1.Operandos
- 2.2.Modos de direccionamiento
- 2.3.Instrucciones
- 2.4.Estructuras de control
- 2.4.1.Estructura if
- 2.4.2.Estructura if-else
- 2.4.3.Estructura while
- 2.4.4.Estructura do-while
- 2.4.5.Estructura for
- 2.4.6.Estructura switch-case
- 3.Formato y codificación de las instrucciones
- 4.Ejecución de las instrucciones
Introducción
Objetivos
-
Conocer los elementos básicos de un computador sencillo y comprender su funcionamiento.
-
Conocer el juego de instrucciones de una arquitectura concreta con unas especificaciones propias.
-
Aprender los conceptos básicos de programación a partir de una arquitectura sencilla pero próxima a una arquitectura real.
-
Ser capaz de convertir el código ensamblador que genera el programador en código máquina que pueda interpretar el computador.
-
Entender qué hace cada una de las instrucciones de un juego de instrucciones en ensamblador y ver qué efectos tiene sobre los diferentes elementos del computador.
-
Entender el funcionamiento de una unidad de control microprogramada para una arquitectura concreta.
1.Organización del computador
-
Procesador (CPU)
-
Registros
-
Unidad aritmética y lógica (ALU)
-
Unidad de control (UC)
-
-
Unidad de memoria principal (Mp)
-
Unidad de entrada/salida (E/S)
-
Sistema de interconexión (Bus)
1.1.Procesador
1.1.1.Organización de los registros
-
Bit de cero (Z): se activa si el resultado obtenido es cero.
-
Bit de transporte (C): también llamado 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. Se activa si al final de la operación nos llevamos una según el algoritmo de suma y resta tradicional operando en binario.
Bit de transporte en la restaEl bit de transporte, también llamado borrow, se genera según el algoritmo convencional de la resta. Pero si hacemos la resta A – B 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, en los que entonces 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 de complemento a 2 con 32 bits, necesitaríamos más bits de los disponibles.
-
Bit de signo (S): activo si el resultado obtenido es negativo. Si el bit más significativo del resultado es 1.
-
Bit para habilitar las interrupciones (IE): si está activo, permite las interrupciones; si está inactivo, no se permiten las interrupciones.
-
Bit de interrupción (IF): si hay una petición de interrupción se activa.
1.1.2.Unidad aritmética y lógica
1.1.3.Unidad de control
-
Acceso a los buses internos.
-
Control de la ALU.
-
Control de otros elementos de la CPU.
-
Acceso al bus externo.
-
Control de la memoria.
-
Control de los módulos de E/S.
Señal |
Observaciones |
Dispositivos afectados |
|
---|---|---|---|
01 |
RoutAenable |
Banco de registros |
|
02 |
RoutBenable |
||
03 |
RinCenable |
||
04 |
RioutA |
Son 16 * 3 = 48 señales. Una señal de cada tipo y para cada registro. |
|
05 |
RioutB |
||
06 |
RiinC |
||
07 |
PCoutA |
Registro PC |
|
08 |
PCinC |
||
09 |
PC+Δ |
Para indicar incremento del registro PC (0-4) |
|
10 |
MARoutEXT |
Registro MAR |
|
11 |
MARinC |
||
12 |
MBRoutA |
Registro MBR |
|
13 |
MBRoutB |
||
14 |
MBRoutEXT |
||
15 |
MBRinC |
||
16 |
MBRinEXT |
||
17 |
ALUinA |
ALU |
|
18 |
ALUinB |
||
19 |
ALUop |
Señales que codifican las operaciones de la ALU. 4bits→ 24 = 16 operaciones diferentes |
|
20 |
IRoutB |
Para poder poner los valores inmediatos de la instrucción en el bus interno B. |
Registro IR |
21 |
IRinA |
||
22 |
Read |
Memoria |
|
23 |
Write |
||
24 |
Read E/S |
Sistema de E/S |
|
25 |
Write E/S |
1.2.Memoria principal
Memoria |
|
---|---|
Dirección |
Contenido |
00120034h |
78 h |
00120035h |
56 h |
00120036h |
34 h |
00120037h |
12 h |
1.2.1.Memoria para la pila
Memoria principal (4Gbytes) |
|
---|---|
Dirección |
Contenido |
00000000h |
Tabla de vectores de interrupción (256 bytes) |
... |
|
00000FFh |
|
0000100h |
Código y datos |
... |
|
FFFEFFFFh |
|
FFFF0000h |
Pila (64Kbytes) |
... |
|
FFFFFFFFh |
1.2.2.Memoria para la tabla de vectores de interrupción
1.3.Unidad de entrada/salida (E/S)
1.4.Sistema de interconexión (bus)
-
Bus interno del procesador (tendremos 3 buses de 32 bits que los podremos utilizar tanto para datos como para direcciones).
-
Bus externo del procesador (tendremos 1 bus de 32 bits que los podremos utilizar tanto para datos como para direcciones).
-
Líneas de comunicación o de E/S (tendremos 1 bus de 32 bits que los podremos utilizar tanto para datos como para direcciones).
2.Juego de instrucciones
2.1.Operandos
2.2.Modos de direccionamiento
-
Número decimal. Se puede expresar un valor negativo añadiendo el signo '–' delante del número.
-
Número binario finalizado con la letra 'b'.
-
Número hexadecimal finalizado con la letra 'h'.
-
Etiqueta, nombre de la etiqueta sin corchetes.
-
Expresión aritmética.
MOV R1 ((00100FF0h+16)*4) MOV R2, [Vec+(10*4)] MOV [R8+(25*4)],R1
MOV R1, 100 ; carga el valor 100 (00000064h) en el registro R1. MOV R1, -100 ; carga el valor -100 (FFFFFF9Ch) en el registro R1. MOV R1, FF9Ch. ; carga el valor F9Ch (0000FF9Ch) en el registro R1. MOV R1, FFFFFF9Ch ; es equivalente a la instrucción donde cargamos -100 en R1. MOV R1, 1001 1100b. ; carga el valor 9Ch (0000009Ch) en el registro R1. MOV R1 1111 1111 1111 1111 1111 1111 1001 1100b ; carga el valor FFFFFF9Ch en el ; registro R1, es equivalente a la instrucción en la que cargamos -100 en R1. MOV R1, var1; ; carga la dirección, no el valor que contiene la variable, en el registro R1. JMP bucle ; carga la dirección que corresponde al punto de código en el que hemos puesto ; la etiqueta bucle en el registro PC. MOV R1 ((00100FF0h+16)*4); carga en R1 el valor 00404000h
INC R2 ; el contenido del registro R2 se incrementa en una unidad. ADD R2, R3 ; se suma el contenido del registro R3 al registro R2: R2 = R2 + R3.
MOV R1, [C0010020h] ; como cada dirección de memoria se corresponde a 1 byte y ; el operando destino, R1, es de 4 bytes, los valores almacenados ; en las posiciones C0010020h - C0010023h se mueven hacia R1. MOV R1, [var1]; ; carga el contenido de la variable var1 en el registro R1. MOV R2, [Vec+(10*4)] ; carga el contenido de la dirección Vec+40 en el registro R2.
MOV R3, var1 ; carga la dirección, no el valor que contiene, en el registro R3. MOV R1, [R3] ; R3 contiene la dirección de la posición de memoria del dato que se debe cargar ; en el registro R1. R1 = M(R3). Como en R3 hemos cargado la dirección de var1 MOV R1, [var1] ; es equivalente a cargar el contenido de la variable var1 en el registro R1
MOV R1,[R2 + 100] ; si R2 = 1200, el operando es M(1200 + 100) ; es decir, el dato está en la dirección de memoria M(1300). MOV [R2+(25*4)], R8 ; carga el valor del registro R8 en la dirección de memoria M(1200+100)
MOV R1, [BC000020h + R5] ; si R5 = 1Bh, el operando está en la dirección de memoria M(BC00003Bh). MOV R1, [vector + R3] ; si R3 = 08h y la dirección de vector=AF00330Ah, el valor que ; cargamos en R1 está en la dirección de memoria M(AF003312h). MOV R1 [(vector+00100200h) + R3] ; cargamos en R1 el valor que se encuentra en M(AF103512h).
JE etiqueta ; se carga en el PC la dirección de la instrucción indicada por la etiqueta.
PUSH 00123400h PUSH R1 POP [var1] POP [R2+16]
2.3.Instrucciones
2.3.1.Instrucciones de transferencia de datos
-
MOV destino, fuente. Mueve el dato al que hace referencia el operando fuente a la ubicación en la que especifica el operando destino (destino ← fuente).
-
PUSH fuente. Almacena el operando fuente (que representa un dato de 32 bits) en la cima de la pila. Primero decrementa SP (registro R15) en 4 unidades y a continuación guarda el dato que hace referencia al operando fuente en la posición de la pila apuntada por SP.
-
POP destino. Recupera sobre el operando destino el valor almacenado en la cima de la pila (que representa un dato de 32 bits). Recupera el contenido de la posición de la pila que apunta a SP (registro R15) y lo guarda donde indique el operando destino; después incrementa SP en 4 unidades.
2.3.2.Instrucciones aritméticas
-
ADD destino, fuente. Hace la operación destino = destino + fuente.
-
SUB destino, fuente. Hace la operación destino = destino – fuente2.
-
MUL destino, fuente. Hace la operación destino = destino * fuente. Si el resultado no se puede representar en 32 bits, se activa el bit de desbordamiento.
-
DIV destino, fuente. Hace la operación destino/fuente, división entera que considera el residuo con el mismo signo que el dividendo. El cociente se guarda en destino y el residuo se guarda en R0. Solo se produce desbordamiento en el caso –231/–1. Si fuente = 0 no es por la división, y para indicarlo se activa el bit de transporte (en los procesadores reales este error genera una excepción que gestiona el sistema operativo).
-
INC destino. Hace la operación destino = destino + 1.
-
DEC destino. Hace la operación destino = destino – 1.
-
CMP destino, fuente. Compara los dos operandos mediante una resta: destino – fuente, y actualiza los bits de resultado. Los operandos no se modifican y el resultado no se guarda.
-
NEG destino. Hace la operación destino = 0 – destino.
Instrucción |
Z |
S |
C |
V |
---|---|---|---|---|
ADD |
x |
x |
x |
x |
SUB |
x |
x |
x |
x |
MUL |
x |
x |
- |
x |
DIV |
x |
x |
x |
x |
INC |
x |
x |
x |
x |
DEC |
x |
x |
x |
x |
CMP |
x |
x |
x |
X |
NEG |
x |
x |
x |
x |
|
Resultado |
R1 = 7, R2 = 1 |
Resultado |
R1 = –1, R2 = –7 |
||||||
---|---|---|---|---|---|---|---|---|---|---|
Z |
S |
C |
V |
Z |
S |
C |
V |
|||
ADD R1, R2 |
R1 = –8 |
0 |
1 |
0 |
1 |
R1 = –8 |
0 |
1 |
1 |
0 |
SUB R1, R2 |
R1 = +6 |
0 |
0 |
0 |
0 |
R1 = +6 |
0 |
0 |
0 |
0 |
SUB R2, R1 |
R2 = –6 |
0 |
1 |
1 |
0 |
R2 = –6 |
0 |
1 |
1 |
0 |
CMP R2, R1 |
R2 = 1 |
0 |
1 |
1 |
0 |
R2 = –7 |
0 |
1 |
1 |
0 |
NEG R1 |
R1 = –7 |
0 |
1 |
1 |
0 |
R1 = +1 |
0 |
0 |
1 |
0 |
INC R1 |
R1 = –8 |
0 |
1 |
0 |
1 |
R1 = 0 |
1 |
0 |
1 |
0 |
DEC R2 |
R2 = 0 |
1 |
0 |
0 |
0 |
R2 = –8 |
0 |
1 |
0 |
0 |
Valor decimal |
Codificación en 4 bits y Ca2 |
---|---|
+7 |
0111 |
+6 |
0110 |
+5 |
0101 |
+4 |
0100 |
+3 |
0011 |
+2 |
0010 |
+1 |
0001 |
0 |
0000 |
–1 |
1111 |
–2 |
1110 |
–3 |
1101 |
–4 |
1100 |
–5 |
1011 |
–6 |
1010 |
–7 |
1001 |
–8 |
1000 |
-
(+6) 0110, lo negamos, 1001 y le sumamos 1, 1010 (–6).
-
(–3) 1101, lo negamos, 0010 y le sumamos 1, 0011 (+3).
-
(+0) 0000, lo negamos, 1111 y le sumamos 1, 0000 (–0). Queda igual.
-
(–8) 1000, lo negamos, 0111 y le sumamos 1, 1000 (–8). Queda igual, +8 no se puede representar en Ca2 utilizando 4 bits.
2.3.3.Instrucciones lógicas
-
AND destino, fuente. Hace la operación destino = destino AND fuente. Hace una 'y' lógica bit a bit.
-
OR destino, fuente. Hace la operación destino = destino OR fuente. Hace una 'o' lógica bit a bit.
-
XOR destino, fuente. Hace la operación destino = destino XOR fuente. Hace una 'o exclusiva' lógica bit a bit.
-
NOT destino. Hace la negación lógica bit a bit del operando destino.
-
SAL destino, fuente. Hace un desplazamiento aritmético a la izquierda de los bits destino, desplaza tantos bits como indique fuente y llena los bits de menos peso con 0. Se produce desbordamiento si el bit de más peso (bit 31) cambia de valor al finalizar los desplazamientos. Los bits que se desplazan se pierden.
-
SAR destino, fuente. Hace un desplazamiento aritmético a la derecha de los bits de destino, desplaza tantos bits como indique fuente. Conserva el bit de signo de destino; es decir, copia el bit de signo a los bits de más peso. Los bits que se desplazan se pierden.
-
TEST destino, fuente. Comparación lógica que realiza una operación lógica AND actualizando los bits de resultado que corresponda según el resultado generado pero sin guardar el resultado. Los operandos no se modifican y el resultado no se guarda.
Instrucción |
Z |
S |
C |
V |
---|---|---|---|---|
AND |
x |
x |
0 |
0 |
OR |
x |
x |
0 |
0 |
XOR |
x |
x |
0 |
0 |
NOT |
- |
- |
- |
- |
SAL |
x |
x |
- |
x |
SAR |
x |
x |
- |
0 |
TEST |
x |
x |
0 |
0 |
Resultado |
R1 = 0110, R2 = 0001 |
Resultado |
R1 = 1111, R2 = 1001 |
|||||||
---|---|---|---|---|---|---|---|---|---|---|
Z |
S |
C |
V |
Z |
S |
C |
V |
|||
AND R1, R2 |
R1 = 0000 |
1 |
0 |
0 |
0 |
R1 = 1001 |
0 |
1 |
0 |
0 |
OR R1, R2 |
R1 = 0111 |
0 |
0 |
0 |
0 |
R1 = 1111 |
0 |
1 |
0 |
0 |
XOR R1, R2 |
R1 = 0111 |
0 |
0 |
0 |
0 |
R1 = 0110 |
0 |
0 |
0 |
0 |
SAL R2,1 |
R2 = 0010 |
0 |
0 |
– |
0 |
R2 = 0010 |
0 |
0 |
– |
1 |
SAR R2,1 |
R2 = 0000 |
1 |
0 |
– |
0 |
R2 = 1100 |
0 |
1 |
– |
0 |
2.3.4.Instrucciones de ruptura de secuencia
-
JMP etiqueta. etiqueta indica la dirección de memoria donde se quiere saltar. Esta dirección se carga en el registro PC. La instrucción que se ejecutará después de JMP etiqueta siempre es la instrucción indicada por etiqueta (JMP es una instrucción de ruptura de secuencia incondicional). El modo de direccionamiento que utilizamos en esta instrucción es el direccionamiento inmediato.
-
JE etiqueta (Jump Equal – Salta si igual). Si el bit Z está activo, carga en el PC la dirección indicada por etiqueta; en caso contrario, continúa la secuencia prevista.
-
JNE etiqueta (Jump Not Equal – Salta si diferente). Si el bit Z está inactivo, carga en el PC la dirección indicada por etiqueta; en caso contrario, continúa la secuencia prevista.
-
JL etiqueta (Jump Less – Salta si más pequeño). Si S ≠ V, carga en el PC la dirección indicada por etiqueta; en caso contrario, continúa la secuencia prevista.
-
JLE etiqueta (Jump Less or Equal – Salta si más pequeño o igual). Si Z = 1 o S ≠ V, carga en el PC la dirección indicada por etiqueta; en caso contrario, continúa la secuencia prevista.
-
JG etiqueta (Jump Greater – Salta si mayor). Si Z = 0 y S = V, carga en el PC la dirección indicada por etiqueta; en caso contrario, continúa la secuencia prevista.
-
JGE etiqueta (Jump Greater or Equal – Salta si mayor o igual). Si S = V, carga en el PC la dirección indicada por etiqueta; en caso contrario, continúa la secuencia prevista.
-
CALL etiqueta (llamada a la subrutina indicada por etiqueta). etiqueta es una dirección de memoria en la que empieza la subrutina. Primero se decrementa SP en 4 unidades, se almacena en la pila el valor PCup y el registro PC se carga con la dirección expresada por la etiqueta. El modo de direccionamiento que utilizamos en estas instrucciones es el direccionamiento inmediato.
-
RET (retorno de subrutina). Recupera de la pila el valor del PC e incrementa SP en 4 unidades.
-
INT servicio (interrupción de software o llamada a un servicio del sistema operativo). servicio es un valor que identifica el servicio solicitado. El modo de direccionamiento que utilizamos en estas instrucciones es el direccionamiento inmediato.
-
IRET (retorno de una rutina de servicio de interrupción). Recupera de la pila del sistema el valor del PC y el registro de estado; el registro SP queda incrementado en 8 unidades.
2.3.5.Instrucciones de entrada/salida
-
IN Ri, puerto. Mueve el contenido del puerto de E/S especificado en registro Ri.
-
OUT puerto, Ri. Mueve el contenido del registro Ri al puerto de E/S especificado.
2.3.6.Instrucciones especiales
-
NOP. No hace nada. El procesador pasa el tiempo de ejecutar una instrucción sin hacer nada.
-
STI. Habilita las interrupciones, activa (pone a 1) el bit IE del registro de estado. Si las interrupciones no están habilitadas, el procesador no admitirá peticiones de interrupción.
-
CLI. Inhibe las interrupciones, desactiva (pone a 0) el bit IE del registro de estado.
2.4.Estructuras de control
2.4.1.Estructura if
if (expresión) sentencia;
if (x>y) maxx = 1;
if: mov r1,[x] cmp r1,[y] jg set jmp endif set: mov [maxx],1 endif:
if: mov r1,[x] cmp r1, [y] jle endif ;condición contraria mov [maxx],1 endif:
2.4.2.Estructura if-else
if (expresión) sentencia1; else sentencia2;
if (x>y) max = x; else max = y;
if: mov r1,[x] mov r2,[y] cmp r1,r2 jg true jmp else true: mov [max],r1 jmp endif else: mov [max],r2 endif:
if: mov r1,[x] mov r2,[y] cmp r1,r2 jle else ;condición contraria mov [max],r1 jmp endif else: mov [max],r2 endif:
2.4.3.Estructura while
while (expresión) sentencia;
while (expresión) { sentencia1; sentencia2; }
while(num > 0){ i = i*num; num = num - 1; } resul = i;
mov r1,[i] mov r2,[num] while: cmp r2,0 jg cont jmp end_w cont: mul r1,r2 sub r2,1 jmp while end_w: mov [resul],r1 mov [i],r1
mov r1,[i] mov r2,[num] while: cmp r2,0 jle end_w ;condición contraria mul r1,r2 sub r2,1 jmp while end_w: mov [resul],r1 mov [i],r1
2.4.4.Estructura do-while
do sentencia; while (expresión);
do { sentencia1; sentencia2; } while (expresión);
do { sum = sum + i; i = i + 1 } while (i <= valor);
mov r1,[i] do: add [sum],r1 add r1,1 cmp r1,[valor] jle do mov [i],r1
2.4.5.Estructura for
for (expr1; expr2; expr3) sentencia;
expr1; while (expr2) { sentencia; expr3; }
expr1: inicialización de un contador expr2: condición de salida de la estructura iterativa expr3: actualización del contador
for (i=0; i<=valor; i++) sum = sum + i;
mov r1,0 for: cmp r1,[valor] jle incr jmp endf incr: add [sum],r1 add r1,1 ; equivalente a inc r1 jmp for endf: mov [i],r1
mov r1,0 for: cmp r1,[valor] jg endf ; condición contraria add [sum],r1 add r1,1 ; equivalente a inc r1 jmp for endf: mov [i],r1
2.4.6.Estructura switch-case
switch (variable) { case valor1: sentencia1; break; case valor2: sentencia2; ... break; ... default; sentenciaN; }
switch (var) { case 1: a=a+b; break; case 2: a=a-b; break; case 3: a=a*b; break; default: a=-a; }
switch: mov r1,[var] cmp r1, 1 jne case2 mov r2, [b] add [a], r2 jmp end_s case2: cmp r1, 2 jne case3 mov r2, [b] sub [a], r2 jmp end_s case3: cmp r1, 3 jne default mov r2, [b] mul [a], r2 jmp end_s default: neg [a] end_s:
3.Formato y codificación de las instrucciones
Operando destino |
Operando fuente |
---|---|
Registro |
Inmediato |
Registro |
|
Memoria |
|
Indirecto |
|
Relativo |
|
Indexado |
|
Memoria |
Inmediato |
Registro |
|
Indirecto |
Inmediato |
Registro |
|
Relativo |
Inmediato |
Registro |
|
Indexado |
Inmediato |
Registro |
3.1.Codificación del código de operación. Byte B0
B0 (Código de operación) |
Instrucción |
---|---|
Especiales |
|
00h |
NOP |
01h |
STI |
02h |
CLI |
Transferencia |
|
10h |
MOV |
11h |
PUSH |
12h |
POP |
Aritméticas |
|
20h |
ADD |
21h |
SUB |
22h |
MUL |
23h |
DIV |
24h |
INC |
25h |
DEC |
26h |
CMP |
27h |
NEG |
Lógicas |
|
30h |
AND |
31h |
OR |
32h |
XOR |
33h |
TEST |
34h |
NOT |
35h |
SAL |
36h |
SAR |
Ruptura de secuencia |
|
40h |
JMP |
41h |
JE |
42h |
JNE |
43h |
JL |
44h |
JLE |
45h |
JG |
46h |
JGE |
47h |
CALL |
48h |
RET |
49h |
INT |
4Ah |
IRET |
Entrada/Salida |
|
50h |
IN |
51h |
OUT |
3.2.Codificación de los operandos. Bytes B1-B10
Bk<7..4> |
Modo de direccionamiento |
---|---|
0h |
Inmediato |
1h |
Registro (direccionamiento directo a registro) |
2h |
Memoria (direccionamiento directo a memoria) |
3h |
Indirecto (direccionamiento indirecto a registro) |
4h |
Relativo (direccionamiento relativo a registro base) |
5h |
Indexado (direccionamiento relativo a registro índice) |
6h |
EN PC (direccionamiento relativo a registro PC) |
De 7h a Fh |
Códigos no utilizados en la implementación actual. Quedan libres para futuras ampliaciones del lenguaje. |
Sintaxis |
Valor que codificar |
Codificación operando |
|||||
---|---|---|---|---|---|---|---|
Bk<7..4> |
Bk<3..0> |
Bk+1 |
Bk+2 |
Bk+3 |
Bk+4 |
||
0 |
00000000h |
0h |
0h |
00h |
00h |
00h |
00h |
100 |
00000064h |
0h |
0h |
64h |
00h |
00h |
00h |
–100 |
FFFFFF9Ch |
0h |
0h |
9Ch |
FFh |
FFh |
FFh |
156 |
0000009Ch |
0h |
0h |
9Ch |
00h |
00h |
00h |
9Ch |
0000009Ch |
0h |
0h |
9Ch |
00h |
00h |
00h |
FF9Ch |
0000FF9Ch |
0h |
0h |
9Ch |
FFh |
00h |
00h |
FFFFFF9Ch |
FFFFFF9Ch |
0h |
0h |
9Ch |
FFh |
FFh |
FFh |
1001 1100b |
0000009Ch |
0h |
0h |
9Ch |
00h |
00h |
00h |
1111 1111 1111 1111 1111 1111 1001 1100b |
FFFFFF9Ch |
0h |
0h |
9Ch |
FFh |
FFh |
FFh |
var1 La etiqueta var1 vale 00AB01E0h |
00AB01E0h |
0h |
0h |
E0h |
01h |
ABh |
00h |
bucle La etiqueta bucle vale 1FF00230h |
1FF00230h |
0h |
0h |
30h |
02h |
F0h |
1Fh |
Sintaxis |
Valor que codificar |
Codificación operando |
|
---|---|---|---|
Bk<7..4> |
Bk<3..0> |
||
R0 |
0h |
1h |
0h |
R10 |
Ah |
1h |
Ah |
Sintaxis |
Valor que codificar |
Codificación operando |
|||||
---|---|---|---|---|---|---|---|
Bk<7..4> |
Bk<3..0> |
Bk+1 |
Bk+2 |
Bk+3 |
Bk+4 |
||
[00AB01E0h] |
00AB01E0h |
2h |
0h |
E0h |
01h |
ABh |
00h |
[var1] La etiqueta var1 vale 00AB01E0h |
00AB01E0h |
2h |
0h |
E0h |
01h |
ABh |
00h |
Sintaxis |
Valor que codificar |
Codificación operando |
|
---|---|---|---|
Bk<7..4> |
Bk<3..0> |
||
[R0] |
0h |
3h |
0h |
[R10] |
Ah |
3h |
Ah |
Sintaxis |
Valores que codificar |
Codificación operando |
|||
---|---|---|---|---|---|
Bk<7..4> |
Bk<3..0> |
Bk+1 |
Bk+2 |
||
[R0+8] |
0h y 0008h |
4h |
0h |
08h |
00h |
[R10+001Bh] |
Ah y 001Bh |
4h |
Ah |
1Bh |
00h |
[R11-4] |
Bh y FFFCh |
4h |
Bh |
FCh |
FFh |
[R3+FFFCh] |
3h y FFFCh |
4h |
3h |
FCh |
FFh |
Sintaxis |
Valores que codificar |
Codificación operando |
|||||
---|---|---|---|---|---|---|---|
Bk<7..4> |
Bk<3..0> |
Bk+1 |
Bk+2 |
Bk+3 |
Bk+4 |
||
[0ABC0100h+R2] |
0ABC0100h y 2h |
5h |
2h |
00h |
01h |
BCh |
0Ah |
[vector1+R9] La etiqueta vector1 vale 0ABC0100h |
0ABC0100h y 9h |
5h |
9h |
00h |
01h |
BCh |
0Ah |
Sintaxis |
Valor que codificar |
Codificación operando |
|||
---|---|---|---|---|---|
Bk<7..4> |
Bk<3..0> |
Bk+1 |
Bk+2 |
||
Inicio La dirección de la etiqueta Inicio vale 0AB00030h y PCup = 0AB00150h |
FEE0h |
6h |
0h |
E0h |
FEh |
Fin La dirección de la etiqueta Fin vale 0AB00200h y PCup = 0AB00150h |
00B0h |
6h |
0h |
B0h |
00h |
3.3.Ejemplos de codificación
-
El campo B0 = 11h
-
El campo Bk: (Bk<7..4>) modo de direccionamiento = 1h y (Bk<3..0>) registro = 3h
B0 |
B1 |
11h |
13h |
-
El campo B0 = 42h
-
El campo Bk: (Bk<7..4>) modo de direccionamiento = 6h y (Bk<3..0>) sin registro = 0h
-
El campo Bk+1, Bk+2: desp16 = etiqueta – PCup.
B0 |
B1 |
B2 |
B3 |
42h |
60h |
84h |
00h |
-
El campo B0 = 43h
-
El campo Bk: (Bk<7..4>) modo de direccionamiento = 6h y (Bk<3..0>) sin registro = 0h
-
El campo Bk+1, Bk+2: desp16 = etiqueta – PCup.
B0 |
B1 |
B2 |
B3 |
43h |
60h |
90h |
FFh |
-
El campo B0 = 34h
-
El campo Bk: (Bk<7..4>) modo de direccionamiento = 2h y (Bk<3..0>) sin registro = 0h.
-
El campo Bk+1, Bk+2, Bk+3, Bk+4: dirección de memoria codificada con 32 bits en formato Little-Endian.
B0 |
B1 |
B2 |
B3 |
B4 |
B5 |
34h |
20h |
5Bh |
00h |
12h |
00h |
Bk para k=0..10 |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Ensamblador |
B0 |
B1 |
B2 |
B3 |
B4 |
B5 |
B6 |
B7 |
B8 |
B9 |
B10 |
PUSH R3 |
11 |
1D |
|||||||||
JMP etiqueta2 |
40 |
00 |
30 |
00 |
F0 |
IF |
|||||
JNE etiqueta2 |
42 |
60 |
7Ch |
FFh |
|||||||
CALL etiqueta2 |
47 |
00 |
30 |
00 |
F0 |
1F |
|||||
NOT [etiqueta1] |
34 |
20 |
5B |
00 |
12 |
00 |
|||||
DEC [R4] |
25 |
34 |
|||||||||
XOR [R13 + 3F4Ah], R12 |
32 |
4D |
4A |
3F |
1C |
||||||
ADD [8A5165F7h + R1], -4 |
20 |
51 |
F7 |
65 |
51 |
8A |
00 |
FC |
FF |
FF |
FF |
RET |
48 |
||||||||||
MOV [R4+32], 100 |
10 |
44 |
20 |
00 |
00 |
64 |
00 |
00 |
00 |
4.Ejecución de las instrucciones
4.1.Lectura de la instrucción
MAR ← PC, read ; Ponemos el contenido de PC en el registro MAR. MBR ← Memoria ; Leemos la instrucción. PC ← PC + Δ ; Incrementamos el PC en Δ unidades (Δ = tamaño de la instrucción en bytes) IR ← MBR ; Cargamos la instrucción en el registro IR.
4.2.Lectura de los operandos fuente
MAR ← IR(Dirección), read MBR ← Memoria
MAR ← Contenido de IR(Registro), read MBR ← Memoria
MAR ← IR(Dirección operando) + Contenido de IR(Registro índice), read MBR ← Memoria
MAR ← Contenido de IR(Registro base) + IR(Desplazamiento), read MBR ← Memoria
MAR ← SP, read MBR ← Memoria SP ← SP + 4 ; 4 es el tamaño de la palabra de pila ; '+' sumamos porque crece hacia direcciones bajas
4.3.Ejecución de la instrucción y almacenamiento del operando destino
-
Si el operando destino ya se ha utilizado como operando fuente (como sucede en las instrucciones aritméticas y lógicas), todavía tendremos la dirección en el MAR.
-
Si el operando destino no se ha utilizado como operando fuente (como sucede en las instrucciones de transferencia y de entrada salida), primero habrá que resolver el modo de direccionamiento como se ha explicado anteriormente en la fase de lectura del operando fuente, dejando la dirección del operando destino en el registro MAR.
4.3.1.Operaciones de transferencia
-
Si el operando destino es un registro y el operando fuente es un inmediato:
Ri ← IR(valor Inmediato)
-
Si el operando destino es un registro y el operando fuente también es un registro:
Ri ← Rj
-
Si el operando destino es un registro y el operando fuente hace referencia a memoria:
Ri ← MBR
-
Si el operando destino hace referencia a memoria y el operando fuente es un inmediato:
MBR ← IR(valor Inmediato) (Resolver modo de direccionamiento),write Memoria ← MBR
-
Si el operando destino hace referencia a memoria y el operando fuente es un registro:
MBR ← Ri, (Resolver modo de direccionamiento),write Memoria ← MBR
-
Si el operando fuente es un registro, primero habrá que llevarlo al registro MBR:
MBR ← Ri SP ← SP - 4 ; 4 es el tamaño de la palabra de pila ; '-' restamos porque crece hacia direcciones bajas MAR ← SP, write Memoria ← MBR
-
Si el operando fuente hace referencia a memoria, ya estará en el registro MBR:
SP ← SP - 4 ; 4 es el tamaño de la palabra de pila ; '-' restamos porque crece hacia direcciones bajas MAR ← SP, write Memoria ← MBR
-
Si el operando destino es un registro:
Ri ← MBR
-
Si el operando destino hace referencia a memoria:
(Resolver modo de direccionamiento), write Memoria ← MBR
4.3.2.Operaciones aritméticas y lógicas
-
Si el operando destino es un registro y el operando fuente es un inmediato:
Ri ← Ri<operación>IR(valor Inmediato)
-
Si el operando destino es un registro y el operando fuente es también un registro:
Ri ← Ri<operación>Ri
-
Si el operando destino es un registro y el operando fuente hace referencia a memoria:
Ri ← Ri<operación>MBR
-
Si el operando destino hace referencia a memoria y el operando fuente es uno inmediato:
MBR ← MBR<operación>IR(valor Inmediato), write Memoria ← MBR
-
Si el operando destino hace referencia a memoria y el operando fuente es un registro:
MBR ← MBR<operación>Ri, write Memoria ← MBR
R0 ← R1 <mod> MBR
-
Si el operando destino es un registro:
Ri ← Ri <operación>
-
Si el operando destino hace referencia a memoria (ya tendremos en el MAR la dirección):
MBR ← MBR<operación>, write Memoria ← MBR
4.3.3.Operaciones de ruptura de secuencia
PC ← IR(Dirección)
PC ← PC + IR(Desplazamiento)
MBR ← PC SP ← SP - 4 ; 4 es el tamaño de la palabra de pila ; '-' restamos porque crece hacia direcciones bajas MAR ← SP, write Memoria ← MBR ; guardamos en la pila PC ← IR(Dirección)
MAR ← SP, read MBR ← Memoria SP ← SP + 4 ; 4 es el tamaño de la palabra de pila. ; '+', sumamos porque crece hacia direcciones bajas. PC ← MBR ; Restauramos el PC
MBR ← Registro de Estado SP ← SP - 4 MAR ← SP, write Memoria ← MBR ;Guardamos el registro de estado en la pila MBR ← PC SP ← SP - 4 MAR ← SP, write Memoria ← MBR ;Guardamos el PC en la pila MAR ← IR(servicio)*4 , read ;4 es el tamaño de cada dirección de la Tabla de Vectores MBR ← Memoria ;Leemos la dirección de la RSI de la tabla de vectores ;La tabla de vectores comienza en la dirección 0 de memoria PC ← MBR ;Cargamos en el PC la dirección de la Rutina de Servicio
MAR ← SP, read MBR ← Memoria SP ← SP + 4 ; 4 es el tamaño de la palabra de pila. ; '+', sumamos porque crece hacia direcciones bajas. PC ← MBR ; Restauramos el PC. MAR ← SP, read MBR ← Memoria SP ← SP + 4 Registro de estado ← MBR ; Restauramos el registro de estado.
4.3.4.Operaciones de Entrada/Salida
Ri ← MBR ;En el registro MBR tendremos el dato leído del puerto ;en el ciclo de lectura del operando fuente
MBR ← Ri ;Ponemos el dato que tenemos en el registro especificado (Resolver modo de direccionamiento), write E/S Memoria ← MBR ;para almacenar como operando destino
4.3.5.Operaciones especiales
4.4.Comprobación de interrupciones
MBR ← Registro de Estado SP ← SP - 4 MAR ← SP, write Memoria ← MBR ;Guardamos el registro de estado en la pila MBR ← PC SP ← SP - 4 MAR ← SP, write Memoria ← MBR ;Guardamos el PC en la pila MAR ← (Índice RSI)*4,read ;4 es el tamaño de cada dirección de la Tabla de Vectores MBR ← Memoria ;Leemos la dirección de la RSI de la tabla de vectores ;La tabla de vectores empieza en la dirección 0 de memoria PC ← MBR ;Cargamos en el PC la dirección de la Rutina de servicio
4.5.Ejemplos de secuencias de microoperaciones
-
Fase 1: Lectura de la instrucción.
-
Fase 2: Lectura de los operandos fuente.
-
Fase 3: Ejecución de la instrucción y almacenamiento del operando destino.
Fase |
Microoperación |
---|---|
1 |
MAR ← PC, read MBR ← Memoria PC ← PC + 5 IR ← MBR |
2 |
(no hay que hacer nada, el operando fuente está en un registro) |
3 |
MBR ← R3 MAR ← R1 + 10, write Memoria ← MBR |
Fase |
Microoperación |
---|---|
1 |
MAR ← PC, read MBR ← Memoria PC ← PC + 2 IR ← MBR |
2 |
(no hay que hacer nada, el operando fuente está en un registro) |
3 |
MBR ← R4 SP ← SP – 4 MAR ← SP, write Memoria ← MBR |
Fase |
Microoperación |
---|---|
1 |
MAR ← PC, read MBR ← Memoria PC ← PC + 7 IR ← MBR |
2 |
MAR ← R5, read MBR ← Memoria |
3 |
MBR ← MBR + 8, write Memoria ← MBR |
Fase |
Microoperación |
---|---|
1 |
MAR ← PC, read MBR ← Memoria PC ← PC + 7 IR ← MBR |
2 |
MAR ← 00120034h+R3, read MBR ← Memoria |
3 |
MBR ← MBR <desp. izquierda> R2, write Memoria ← MBR |
Fase |
Micro-operación |
---|---|
1 |
MAR ← PC, read MBR ← Memoria PC ← PC + 4 IR ← MBR |
2 |
(no hay que hacer nada, se entiende etiqueta como op. fuente) |
3 |
Si bit de resultado Z=1 PC ← PC + etiqueta; si no, no hacer nada |
4.6.Ejemplo de señales de control y temporización
Fase |
Paso |
Microoperación |
|
---|---|---|---|
1 |
1 |
MAR ← PC, read |
|
2 |
MBR ← Memoria |
PC ← PC + 5 |
|
3 |
IR ← MBR |
||
2 |
1 |
MAR ← R1 + 10, read |
|
2 |
MBR ← Memoria |
||
3 |
1 |
R3 ← MBR |
|
1 |
1 |
MAR ← PC, read |
Siguiente instrucción |