a = b + c * d
t1 = c * d
a = b + t1
LOAD R1, c // Carrega c em R1
LOAD R2, d // Carrega d em R2
MUL R3, R1, R2 // R3 = R1 * R2
LOAD R4, b // Carrega b em R4
ADD R5, R4, R3 // R5 = R4 + R3
STORE a, R5 // Armazena R5 em a
x = y op z
x = op y
x = y
goto L
if x goto L
if x relop y goto L
# TAC
if x > y goto L1
z = 0
goto L2
L1: z = 1
L2: ...
# Código de máquina
LOAD R1, x
LOAD R2, y
CMP R1, R2
BGT L1 # Branch if Greater Than
MOV R3, 0
B L2 # Unconditional branch
L1: MOV R3, 1
L2: ...
# TAC
L1: if x <= 0 goto L2
x = x - 1
goto L1
L2: ...
# Código de máquina
L1: LOAD R1, x
CMP R1, 0
BLE L2 # Branch if Less or Equal
SUB R1, R1, 1
STORE x, R1
B L1
L2: ...
a = b + c
d = a * 2
e = d - c
f = e + b
# R1=b, R2=c
LOAD R1, b
LOAD R2, c
ADD R3, R1, R2 # R3=a
MUL R3, R3, 2 # R3=d (reutiliza R3)
SUB R3, R3, R2 # R3=e (reutiliza R3)
ADD R3, R3, R1 # R3=f (reutiliza R3)
STORE f, R3
# Instruções de carregamento e armazenamento
LOAD Rx, var # Carrega valor da variável para registrador
STORE var, Rx # Armazena valor do registrador na variável
# Operações aritméticas
ADD Rd, Ra, Rb # Rd = Ra + Rb
SUB Rd, Ra, Rb # Rd = Ra - Rb
MUL Rd, Ra, Rb # Rd = Ra * Rb
DIV Rd, Ra, Rb # Rd = Ra / Rb
# Controle de fluxo
CMP Ra, Rb # Compara Ra com Rb
BEQ label # Salta para label se igual (=)
BNE label # Salta para label se diferente (≠)
BLT label # Salta para label se menor (<)
BGT label # Salta para label se maior (>)
B label # Salto incondicional
a = b + c
LOAD R1, b # Carrega b em R1
LOAD R2, c # Carrega c em R2
ADD R3, R1, R2 # R3 = R1 + R2
STORE a, R3 # Armazena R3 em a
class Instruction:
def __init__(self, op, dest=None, src1=None, src2=None):
self.op = op
self.dest = dest
self.src1 = src1
self.src2 = src2
def __str__(self):
if self.op == 'LOAD':
return f"LOAD {self.dest}, {self.src1}"
elif self.op == 'STORE':
return f"STORE {self.src1}, {self.dest}"
elif self.op in ['ADD', 'SUB', 'MUL', 'DIV']:
return f"{self.op} {self.dest}, {self.src1}, {self.src2}"
# ... outros casos ...
class CodeGenerator:
def __init__(self):
self.instructions = []
self.next_reg = 0
def get_register(self):
reg = f"R{self.next_reg}"
self.next_reg += 1
return reg
def generate_binary_op(self, op, dest, src1, src2):
r1 = self.get_register()
r2 = self.get_register()
r3 = self.get_register()
self.instructions.append(Instruction('LOAD', r1, src1))
self.instructions.append(Instruction('LOAD', r2, src2))
self.instructions.append(Instruction(op, r3, r1, r2))
self.instructions.append(Instruction('STORE', dest, r3))
return self.instructions
class TACTranslator:
def __init__(self, register_count=8):
self.instructions = []
self.reg_manager = RegisterManager(register_count)
self.variable_map = {} # Mapeia variáveis para registradores
def translate_instruction(self, tac_instr):
if tac_instr.op == '+':
return self._translate_add(tac_instr.dest, tac_instr.src1, tac_instr.src2)
elif tac_instr.op == '*':
return self._translate_mul(tac_instr.dest, tac_instr.src1, tac_instr.src2)
# ... outros operadores ...
def _translate_add(self, dest, src1, src2):
# Lógica para traduzir adição, considerando alocação de registradores
r1 = self._ensure_in_register(src1)
r2 = self._ensure_in_register(src2)
r_dest = self.reg_manager.allocate_register(dest)
self.instructions.append(Instruction('ADD', r_dest, r1, r2))
self.variable_map[dest] = r_dest
def print_assembly(instructions):
for i, instr in enumerate(instructions):
print(f"{i:04d}: {instr}")
# Exemplo de uso
generator = CodeGenerator()
tac_instructions = [
TACInstruction('+', 'a', 'b', 'c'),
TACInstruction('*', 'd', 'a', '2'),
# ... mais instruções ...
]
for tac in tac_instructions:
generator.translate_instruction(tac)
print_assembly(generator.instructions)
0000: LOAD R0, b
0001: LOAD R1, c
0002: ADD R2, R0, R1
0003: STORE a, R2
0004: LOAD R3, a
0005: LOAD R4, 2
0006: MUL R5, R3, R4
0007: STORE d, R5
# ... outras instruções ...
x = a + b
y = c - d
z = x * y
if z > 10 goto L1
w = 0
goto L2
L1: w = z
L2: resultado = w + 5
função soma_vetor(vetor, tamanho):
total = 0
i = 0
enquanto i < tamanho faça:
total = total + vetor[i]
i = i + 1
retornar total