.data .comm curr,4 #int curr .text prompt: .string "Sort:\n" sorted: .string "Sorted:\n" formatp: .string "%d\n" formats: .string "%d" .globl main main: movq $0 , %r12 # initialize counter to 0 movq $prompt, %rdi # printf("Sort:\n"); movq $0 , %rax # call printf # gather: movq $formats, %rdi # Gets value # scanf("%d",&curr); movq $curr, %rsi # movq $0 , %rax # call scanf # push %rax # save return value from scanf on stack movq $curr, %rsi # store value in %rsi movq (%rsi) , %rsi # pop %rax # return value from scanf cmpq $1 , %rax # Did we see an EOF? jne sort # Jump to sort if we did # OTHERWISE push %rsi # save last value on stack addq $1, %r12 # add 1 to total number of elements jmp gather # return to gather more values sort: cmpq $0 , %r12 # did we actually get any elements? je end # no, jump to the end # otherwise: movq $sorted, %rdi # printf("Sorted:\n"); movq $0 , %rax # call printf # movq %r12 , %rax # save number of values for later sortloop: cmpq $1 , %r12 # only one element left? jl printresults # base case; we're done movq $-1 , %rcx # create a counter for inner loop innerloop: incq %rcx # increment counter cmpq %rcx , %r12 # compare with outer value jle noswap # reached the end so exit inner loop movq %rcx , %r8 # imulq $8 , %r8 # create real pointer addq %rsp , %r8 # to current value on stack movq %r8 , %r9 # addq $8 , %r9 # and to the next value movq (%r8) , %rsi # movq (%r9) , %rdi # cmpq %rsi , %rdi # compare values jge innerloop # if values are OK, dont swap # otherwise swap values movq %rdi , (%r8) # overwrite r8 with r9 movq %rsi , (%r9) # copy value from temp to r8 jmp innerloop noswap: # finished with innerloop decq %r12 # subtract 1 from r12 jmp sortloop printresults: movq %rax , %r12 # restore number of values printloop: cmpq $0 , %r12 # any elements left? je end # nope, we're done # yes decq %r12 # decrement the counter pop %rsi # pop result to rsi movq $0 , %rax # empty rax movq $formatp , %rdi # add the format argument call printf # printf jmp printloop # do it again end: ret