# Execution begins at address 0 .pos 0 irmovq stack, %rsp # Set up stack pointer call main # Execute main program halt # Terminate program # Array of 4 elements .align 8 array: .quad 0x000d000d000d .quad 0x00c000c000c0 .quad 0x0b000b000b00 .quad 0xa000a000a000 main: irmovq array,%rdi irmovq $4,%rsi call rsum # rsum(array, 4) ret /* $begin rsum-ys */ # long rsum(long *start, long count) # start in %rdi, count in %rsi rsum: xorq %rax,%rax # Set return value to 0 andq %rsi,%rsi # Set condition codes je return # If count == 0, return 0 pushq %rbx # Save callee-saved register mrmovq (%rdi),%rbx # Get *start irmovq $-1,%r10 addq %r10,%rsi # count-- irmovq $8,%r10 addq %r10,%rdi # start++ call rsum addq %rbx,%rax # Add *start to sum popq %rbx # Restore callee-saved register return: ret /* $end rsum-ys */ # The stack starts here and grows to lower addresses .pos 0x200 stack: