BITS 64 SECTION .text GLOBAL sort sort: push rbx push rbp push r12 cmp rsi, 0x1 jbe end mov rbx, rsi mov rax, rsi sar rax, 0x1 mov r12, rax mov rbp, rdi mov rsi, rax call sort lea rdi, [rbp + r12 * 8] mov rax, rbx sub rax, r12 mov rsi, rax call sort lea rax, [rbx * 8] sub rsp, rax mov r11, rsp mov r8, 0x0 mov r9, 0x0 mov r10, 0x0 lea rdi, [rbp + r12 * 8] lea rsi, [rbp + rbx * 8] merge: lea rax, [rbp + r8 * 8] cmp rdi, rax je first_end mov rcx, [rax] lea rax, [r12 + r9 * 1] lea rax, [rbp + rax * 8] cmp rsi, rax je second_end mov rdx, [rax] cmp rcx, rdx jle second first: lea rax, [r11 + r10 * 8] mov [rax], rdx add r9, 0x1 add r10, 0x1 jmp jump second: lea rax, [r11 + r10 * 8] mov [rax], rcx add r8, 0x1 add r10, 0x1 jump: jmp merge first_end: lea rax, [r12 + r9 * 1] lea rax, [rbp + rax * 8] cmp rax, rsi je after_merge mov rdx, [rax] lea rax, [r11 + r10 * 8] mov [rax], rdx add r9, 0x1 add r10, 0x1 jmp first_end second_end: lea rax, [rbp + r8 * 8] cmp rax, rdi je after_merge mov rcx, [rax] lea rax, [r11 + r10 * 8] mov [rax], rcx add r8, 0x1 add r10, 0x1 jmp second_end after_merge: mov rax, 0x0 fill: cmp rbx, rax je repair_stack lea rcx, [r11 + rax * 8] mov rdx, [rcx] lea rcx, [rbp + rax * 8] mov [rcx], rdx add rax, 0x1 jmp fill repair_stack: lea rax, [rbx * 8] add rsp, rax end: pop r12 pop rbp pop rbx ret