42 lines
966 B
Text
42 lines
966 B
Text
# 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:
|
|
|