Ejemplos de Assembly
Ejemplos de Traducción Assembly
Ejemplo 1: Función Simple
TAC:
┌─ func suma
t0 = a + b
return t0
└─ endfunc suma
x86-64:
suma:
enter $(8 * 3), $0 ; 3 variables: t0, b, a
mov %rdi, -24(%rbp) ; Guardar param a (1er param, último offset)
mov %rsi, -16(%rbp) ; Guardar param b (2do param)
mov -24(%rbp), %r10 ; Cargar a
mov -16(%rbp), %r11 ; Cargar b
add %r11, %r10 ; a + b
mov %r10, -8(%rbp) ; Guardar t0 (primera var agregada)
mov -8(%rbp), %rax ; Cargar t0 para retorno
leave
ret
Stack: -8(%rbp)=t0, -16(%rbp)=b, -24(%rbp)=a
Ejemplo 2: Programa con Llamada
Código:
program {
integer suma(integer a, integer b) {
return a + b;
}
void main() {
suma(5, 10);
}
}
x86-64:
suma:
enter $(8 * 3), $0
mov %rdi, -16(%rbp)
mov -16(%rbp), %r10
mov -24(%rbp), %r11
add %r11, %r10
mov %r10, -8(%rbp)
mov -8(%rbp), %rax
leave
ret
.globl main
main:
enter $(8 * 1), $0
mov $10, %rdi
mov $5, %rsi
mov $0, %rax
call suma
mov %rax, -8(%rbp)
mov $0, %rax
leave
ret
Ejemplo 3: While
TAC:
func main
i = 0
L0:
t0 = i < 10
if !t0 goto L1
t1 = i + 1
i = t1
goto L0
L1:
endfunc main
x86-64:
.globl main
main:
enter $(8 * 3), $0
mov $0, %r10
mov %r10, -8(%rbp) ; i = 0
.L0:
mov -8(%rbp), %r10
mov $10, %r11
cmp %r11, %r10
mov $0, %r11
mov $1, %r10
cmovl %r10, %r11
mov %r11, -16(%rbp) ; t0 = i < 10
mov -16(%rbp), %r10
mov $1, %r11
cmp %r10, %r11
jne .L1
mov -8(%rbp), %r10
mov $1, %r11
add %r11, %r10
mov %r10, -24(%rbp) ; t1 = i + 1
mov -24(%rbp), %r10
mov %r10, -8(%rbp) ; i = t1
jmp .L0
.L1:
mov $0, %rax
leave
ret
Ejemplo 4: Expresión Compleja
TAC: (3 + 5) * 2 - 8 / 4
x86-64:
mov $3, %r10
mov $5, %r11
add %r11, %r10
mov %r10, -8(%rbp) ; t0 = 3 + 5
mov -8(%rbp), %r10
mov $2, %r11
imul %r11, %r10
mov %r10, -16(%rbp) ; t1 = t0 * 2
mov $8, %rax
cqo
mov $4, %r11
idiv %r11
mov %rax, -24(%rbp) ; t2 = 8 / 4
mov -16(%rbp), %r10
mov -24(%rbp), %r11
sub %r11, %r10
mov %r10, -32(%rbp) ; t3 = t1 - t2
Compilación
# Usar c-tds para compilar
c-tds <test>.ctds -o test.ass
Referencias
Generación · Arquitectura · assembly.c