%include "asm_io.inc"
segment .data
msg db "Values: ",0 ; the output message
segment .text
global asm_main
asm_main:
push ebp ; setup
mov ebp, esp ; setup
pusha ; setup
push dword 4 ; push the first param of f, 4
push dword 5 ; push the second param of f, 5
call f ; call function f
add esp, 8 ; clean up the stack
popa ; clean up
mov eax, 0 ; clean up
mov esp, ebp ; clean up
pop ebp ; clean up
ret ; clean up
;;; Function f
f:
push ebp ; setup
mov ebp, esp ; setup
pusha ; setup
push dword 2 ; push the first param of g, 2
push dword [ebp + 12] ; push the second param of g, x
push dword [ebp + 8] ; push the third param of g, y
call g ; call function g
add esp, 12 ; clean up the stack
popa ; clean up
mov eax, 0 ; clean up
mov esp, ebp ; clean up
pop ebp ; clean up
ret ; clean up
;;; Function g
g:
push ebp ; setup
mov ebp, esp ; setup
pusha ; setup
cmp dword [ebp + 16], 0 ; if n == 0, print
je print
mov eax, [ebp + 12] ; sum up x and y
add eax, [ebp + 8] ; and store it in eax
mov ebx, [ebp + 16] ; let ebx = n - 1
dec ebx
push ebx ; push n - 1
push eax ; push x + y
inc eax ; let eax = x + y + 1
push eax ; push x + y + 1
call g ; call function g
add esp, 12 ; clean up stack
jmp g_end
print:
mov eax, msg ; print message
call print_string
mov eax, 91 ; print [
call print_char
mov eax, [ebp + 12] ; print x
call print_int
mov eax, 44 ; print ,
call print_char
mov eax, [ebp + 8] ; print y
call print_int
mov eax, 93 ; print ]
call print_char
call print_nl ; print blank line
g_end:
popa ; clean up
mov eax, 0 ; clean up
mov esp, ebp ; clean up
pop ebp ; clean up
ret ; clean up