01 · Punto de partida
Calculadora de 5 botones
El mismo silicio suma, resta y opera bits según S1S0 + M: AND, OR, XOR, ADD, SUB. Más 4 banderas (Z, C, N, V) que el micro usará para saltar. Es la 74181 en miniatura.
- ¿Qué hace cada operación?
- ¿Cómo se resta sin restador?
- ¿Qué avisa cada flag?
- ¿Cómo crece a N bits?
02 · Operaciones
Cinco por el precio de una
| OP | F | Cout |
|---|---|---|
| AND | A·B | 0 |
| OR | A+B | 0 |
| XOR | A⊕B | 0 |
| ADD | A⊕B⊕Cin | mayoría |
| SUB | A⊕~B⊕Bin | ~préstamo |
SUB con Bin=1: A + ~B + 1 (Tema 24). Cout en SUB = 1 significa “alcanzó” (sin préstamo); 0 = pidió prestado.
03 · N bits y 74181
Ripple + banderas
ALU discreta (taller)
Ripple de 1 bit
4 celdas encadenadas como el sumador: simple, didáctica, lenta.
74181 (la real)
4 bits, 22 operaciones
Con P/G para lookahead y salidas A=B + carry. La de los minis de los 70.
- Z (cero)
- F = 0000: igualdad, fin de conteo, string terminado. La más usada.
- C (carry)
- Acarreo/préstamo del MSB: aritmética sin signo y rotaciones.
- N (signo)
- Copia del MSB: con Ca2 dice si es negativo.
- V (overflow)
- Cin≠Cout del MSB: la suma con signo mintió (Tema 24).
04 · Para qué sirven
Los ojos del programa
El micro salta según flags: BEQ (Z=1), BCS (C=1), BMI (N=1). Sin ALU no hay comparación; sin flags no hay if. El curso 7 los usará; este tema los fabrica.
05 · ALU en código
Cinco ops, cuatro flags
ALU de 1 bit más versión 4 bits con banderas.
Python en tu navegador. Operá y mirá los flags.
def alu1(op, a, b, cin=0):
if op == "AND":
f, c = a and b, 0
elif op == "OR":
f, c = a or b, 0
elif op == "XOR":
f, c = a ^ b, 0
elif op == "ADD":
f, c = a ^ b ^ cin, (a and b) or (a and cin) or (b and cin)
else:
nb = 1 - b
f, c = a ^ nb ^ cin, (a and nb) or (a and cin) or (nb and cin)
print(f"{op} {a},{b},{cin} -> F={int(f)} Cout={int(c)}")
return int(f), int(c)
for op in ("AND", "OR", "XOR", "ADD", "SUB"):
alu1(op, 1, 0, 1)
AND 1,0→0; OR→1; XOR→1; ADD 1+0+1→0 c1; SUB 1−0… con Bin=1: 1+1+1→1 c1. ¿Y SUB 0−1?
4 bits con flags
def alu4(op, a, b):
bb = b if op != "SUB" else (~b) & 0xF
cin, f, cs = (1 if op == "SUB" else 0), 0, []
for i in range(4):
ai, bi = (a >> i) & 1, (bb >> i) & 1
if op in ("ADD", "SUB"):
si, cout = ai ^ bi ^ cin, (ai and bi) or (ai and cin) or (bi and cin)
else:
si = {"AND": ai and bi, "OR": ai or bi, "XOR": ai ^ bi}[op]
cout = 0
f |= si << i
cs.append(int(cout))
cin = int(cout)
z, n, v = (f == 0), (f >> 3) & 1, (cs[2] ^ cs[3])
print(f"{op} {a:04b},{b:04b} -> {f:04b}={f} Z={int(z)} N={n} V={v} C={cin}")
return f
alu4("ADD", 9, 6)
alu4("SUB", 6, 9)
alu4("AND", 9, 6)
06 · Analogía programador
CPU en miniatura
- 1ALU = calculadora.
Opera sin decidir el programa: el opcode elige, ella ejecuta.
- 2Flags = return codes.
Cero, carry, signo: como exit codes que el siguiente comando consulta.
- 374181 = librería.
Operaciones listas y probadas: no reescribir lo que el MSI ya da.
07 · Exploración
Laboratorio: mini-181
ALU de 4 bits con 5 operaciones: mové A/B y mirá F más banderas.
Mini-181
ADD 9+6 = 1111
ADD 9+6: F=1111 (15), Cout 0.
Preguntas para explorar
- Probá AND con 9 y 6. ¿F? ¿Por qué 0?
- Probá SUB 6−9. ¿F? ¿Cout? ¿Qué significa?
- Probá ADD 7+7. ¿F? ¿V? ¿Por qué?
Ver respuestas sugeridas
- 0 (1001·0110 sin bits comunes): AND exige coincidencia por posición.
- 1101 (13), Cout 0 = pidió prestado: 6−9 = −3 mod 16 ✓. (V da 1 porque con signo leería 6−(−7) = 13: overflow. V siempre habla en Ca2.)
- 1110 (14), V=1: 7+7 = 14 > 7 con signo (Cin MSb=1, Cout=0): overflow.
08 · Comprensión
Confusiones frecuentes
«ALU = microprocesador»
Falta control, registros y programa: la ALU es el músculo, no el cerebro. Cerebro en el curso 7.
«Resta con otro circuito»
XOR en B + Cin=1 convierten el sumador: M elige sin duplicar silicio.
«Flags decorativos»
Los usa cada salto condicional: Z decide ==, C decide >= sin signo. Sin flags no hay if.
«Cout en SUB es carry»
Es “no-préstamo”: 1 = alcanzó, 0 = pidió. Leerlo al revés que en ADD es el error clásico.
09 · Práctica guiada
Ejercicios de operación
Ejercicio 1: tabla de 1 bit
Completá AND/OR/XOR/ADD/SUB para (1,0,1). Verificá cada fila con alu1().
Ver solución razonada
AND 0, OR 1, XOR 1, ADD 0 c1, SUB 1 c1: ADD 1+0+1 = 0 lleva 1; SUB 1+1+1 (B negado) = 1 lleva 1.
Ejercicio 2: flags de 0
SUB 5−5. ¿F? ¿Z? ¿Cout? ¿Qué “dice” cada flag?
Ver solución
F=0000, Z=1, Cout=1: cero (“iguales”), alcanzó (“no pidió”). BEQ saltaría.
Ejercicio 3: XOR vs ADD
A=B=7: XOR da 0, ADD da 14. Explicá bit a bit por qué difieren.
Ver solución
XOR: 0 sin carry (iguales se anulan). ADD: 0111+0111 = 1110 con carries 1,1,1,0. El carry lo cambia todo.
10 · Síntesis
Ideas para recordar
- 5 ops: AND/OR/XOR/ADD/SUB; SUB = ADD + ~B + 1.
- SUB Cout = no-préstamo (1 alcanzó).
- Flags Z/C/N/V: cero, carry, signo, overflow.
- Ripple para N bits; 74181 la real.
- Flags → saltos: el if del futuro.
Operaciones dominadas. Ahora lo que parpadea: en el próximo tema, hazards.