代码如下,思路和c实现大同小异,主要是寄存器的使用以及地址的使用,具体参见注释。
# void qsort(int* start, int* end) # start = &a[0], end = &a[n]
qsort:
lea 4(%rdi), %rax # tmp = &a[1]
cmp %rsi, %rax # if tmp >= end
jge .L4 # then return
pushq %rsi # save rsi
pushq %rdi # save rdi
movl (%rdi), %eax # save first ele
.L1:
cmp %rsi, %rdi # if start >= end
jge .L2 # end loop
subq $4, %rsi # --end
movl (%rsi), %ecx # tmp1 = *end
cmp %eax, %ecx # if tmp1 >= a[0]
jge .L1 # loop
movl %ecx, (%rdi) # *start = tmp1
.L2:
cmp %rsi, %rdi # if start >= end
jge .L3 # end loop
addq $4, %rdi # ++start
movl (%rdi), %ebx # tmp2 = *start