t1 = c * d
t2 = b + t1
a = t2
a = b + c;
t1 = b + c
a = t1
MOV AX, [b] ; Carrega b em AX
ADD AX, [c] ; Soma c a AX
MOV [a], AX ; Armazena resultado em a
x = (a + b) * (c - d);
t1 = a + b
t2 = c - d
t3 = t1 * t2
x = t3
MOV AX, [a] ; Carrega a em AX
ADD AX, [b] ; Soma b a AX
MOV BX, AX ; Salva (a+b) em BX
MOV AX, [c] ; Carrega c em AX
SUB AX, [d] ; Subtrai d de AX
MUL BX ; Multiplica AX por BX
MOV [x], AX ; Armazena resultado em x
int soma(int a, int b) {
return a + b;
}
int main() {
int x = 5;
int y = 10;
int z = soma(x, y);
return 0;
}
soma:
PUSH BP ; Salva BP antigo
MOV BP, SP ; BP aponta para stack frame
MOV AX, [BP+8] ; Carrega primeiro parâmetro (a)
ADD AX, [BP+12]; Soma segundo parâmetro (b)
POP BP ; Restaura BP
RET ; Retorna (AX contém resultado)
main:
MOV [x], 5 ; x = 5
MOV [y], 10 ; y = 10
PUSH [y] ; Empilha segundo argumento
PUSH [x] ; Empilha primeiro argumento
CALL soma ; Chama função soma
ADD SP, 8 ; Limpa parâmetros da pilha
MOV [z], AX ; z = resultado da soma
MOV AX, 0 ; Retorno = 0
RET ; Retorna para sistema
MOV AX, [1000] ; Carrega em AX o valor do endereço 1000
MOV BX, 1000 ; BX contém o endereço
MOV AX, [BX] ; Carrega em AX o valor apontado por BX
MOV BP, 2000 ; BP é o registrador base
MOV AX, [BP+8] ; Carrega em AX o valor do endereço BP+8
MOV SI, 4 ; SI é o índice (multiplicado por tamanho do item)
MOV AX, [array+SI] ; Carrega o elemento array[1] (assumindo int)
# Exemplo de templates em pseudocódigo
templates = {
"assign": "MOV {dest}, {src}",
"add": "MOV AX, {op1}\nADD AX, {op2}\nMOV {dest}, AX",
"sub": "MOV AX, {op1}\nSUB AX, {op2}\nMOV {dest}, AX",
"if": "CMP {cond}, 0\nJE {else_label}",
# mais templates...
}
class GeradorCodigo:
def __init__(self):
self.codigo = []
self.contador_label = 0
def gerar_label(self):
label = f"L{self.contador_label}"
self.contador_label += 1
return label
def emitir(self, instrucao):
self.codigo.append(instrucao)
def gerar_atribuicao(self, dest, src):
self.emitir(f"MOV AX, {src}")
self.emitir(f"MOV {dest}, AX")
def gerar_operacao(self, dest, op1, op2, operador):
self.emitir(f"MOV AX, {op1}")
if operador == "+":
self.emitir(f"ADD AX, {op2}")
elif operador == "-":
self.emitir(f"SUB AX, {op2}")
elif operador == "*":
self.emitir(f"MOV BX, {op2}")
self.emitir(f"MUL BX")
# outros operadores...
self.emitir(f"MOV {dest}, AX")
def obter_codigo(self):
return "\n".join(self.codigo)
# Código fonte
if (x > 0) {
y = 1;
} else {
y = 0;
}
# Assembly
MOV AX, [x]
CMP AX, 0
JLE else_label
MOV [y], 1
JMP end_if
else_label:
MOV [y], 0
end_if:
# Código fonte
while (i < 10) {
sum = sum + i;
i = i + 1;
}
# Assembly
loop_start:
MOV AX, [i]
CMP AX, 10
JGE loop_end
MOV AX, [sum]
ADD AX, [i]
MOV [sum], AX
MOV AX, [i]
ADD AX, 1
MOV [i], AX
JMP loop_start
loop_end:
# Antes da otimização
MOV AX, 5
MOV BX, AX
# Após otimização
MOV BX, 5
# Antes da otimização
MOV AX, 10
ADD AX, 5
MOV AX, 20 ; Sobrescreve cálculo anterior
# Após otimização
MOV AX, 20
# Antes da otimização
MUL BX, 2 ; Multiplicação
# Após otimização
ADD BX, BX ; Adição é mais rápida
; Calcular (x + y)
MOV AX, [x] ; Carrega x em AX
ADD AX, [y] ; Adiciona y a AX
MOV BX, AX ; Salva (x + y) em BX
; Multiplicar por z
MOV AX, BX ; Carrega (x + y) em AX
MOV CX, [z] ; Carrega z em CX
MUL CX ; AX = AX * CX
; Dividir por 2
MOV BX, 2 ; Carrega 2 em BX
DIV BX ; AX = AX / BX
; Armazenar resultado
MOV [result], AX ; Salva resultado
import sys
class GeradorCodigoAssembly:
def __init__(self):
self.codigo = []
self.contador_temp = 0
self.contador_label = 0
self.variaveis = {}
def gerar_temp(self):
temp = f"t{self.contador_temp}"
self.contador_temp += 1
return temp
def gerar_label(self):
label = f"L{self.contador_label}"
self.contador_label += 1
return label
def emitir(self, instrucao):
self.codigo.append(instrucao)
def processar_tac(self, tac_instrucoes):
for instrucao in tac_instrucoes:
partes = instrucao.split()
if len(partes) == 3 and partes[1] == "=":
# Atribuição simples: a = b
dest, _, src = partes
self.emitir(f"MOV AX, {src}")
self.emitir(f"MOV {dest}, AX")
elif len(partes) == 5 and partes[1] == "=":
# Operação binária: a = b op c
dest, _, op1, op, op2 = partes
self.emitir(f"MOV AX, {op1}")
if op == "+":
self.emitir(f"ADD AX, {op2}")
elif op == "-":
self.emitir(f"SUB AX, {op2}")
elif op == "*":
self.emitir(f"MOV BX, {op2}")
self.emitir(f"MUL BX")
elif op == "/":
self.emitir(f"MOV BX, {op2}")
self.emitir(f"DIV BX")
self.emitir(f"MOV {dest}, AX")
# Outros tipos de instruções...
def obter_codigo(self):
return "\n".join(self.codigo)
# Exemplo de uso
tac = [
"t1 = a + b",
"t2 = t1 * c",
"result = t2"
]
gerador = GeradorCodigoAssembly()
gerador.processar_tac(tac)
print(gerador.obter_codigo())
// Programa simples de cálculo
int main() {
int a = 10;
int b = 5;
int soma = a + b;
int diferenca = a - b;
if (soma > 10) {
return soma;
} else {
return diferenca;
}
}
section .data
a dd 10 ; int a = 10
b dd 5 ; int b = 5
soma dd 0 ; int soma
diferenca dd 0 ; int diferenca
section .text
global main
main:
; Calcular soma = a + b
MOV EAX, [a]
ADD EAX, [b]
MOV [soma], EAX
; Calcular diferenca = a - b
MOV EAX, [a]
SUB EAX, [b]
MOV [diferenca], EAX
; if (soma > 10)
MOV EAX, [soma]
CMP EAX, 10
JLE else_branch
; return soma
MOV EAX, [soma]
JMP end_if
else_branch:
; return diferenca
MOV EAX, [diferenca]
end_if:
RET