.section .data number_printing_message: .asciz "The number was %d\n" .section .text // Put the parameter in rsi print_number: mov $number_printing_message, %rdi mov $0, %rax call printf ret // First number goes in R8, second in R9 // We won't change either register (const R8, const R9) // Return value will be in R10 add_numbers: mov %r8, %r10 add %r9, %r10 ret // The number to square goes on the stack // The result will be on the stack in its place square_number: pop %r14 pop %rax mul %rax push %rax push %r14 ret square_number_nopop: # mov 0x8(%rbp), %rax # mul %rax # mov %rax, 0x8(%rbp) # add $8, %rsp jmp done ret push_extra_values: push %rax mov $10, %rbx push %rbx add $16, %rsp ret .globl main main: mov $921, %rsi call print_number mov $123, %rsi push %rsi call print_number pop %rsi mov %rsi, %r8 mov $42, %r9 call add_numbers mov %r10, %rsi call print_number push $20 call square_number pop %rsi call print_number push $352 call square_number pop %rsi call print_number call push_extra_values call square_number_nopop done: mov $42, %rsi call print_number # Exit the program with status 0 movl $1, %eax movl $300, %ebx int $0x80