section .data
    array db 4,10,58,2,1,9 ; 배열 데이터
    len_of_array equ $ - array
    temp_array times len_of_array db 0

section .bss
    num_string resb 6                       
    comma resb 1               

section .text
    global _start

_start:
    mov rsi, comma
    mov byte [rsi+100], ','
    xor rsi, rsi

.sort_start: 
    mov R13, 1  ; 배열 하나의 길이를 1로 초기화. 2,4,8,16까지 갈 예정. 
    xor R8, R8  ; left 배열 포인터
    xor R9, R9  ; right 배열 포인터
    xor rsi, rsi ; 
    
.sort_loop:
    xor R12, R12
    ;
    add R12, R9
    add R12, R13 
    add R12, rsi 
    cmp R12, len_of_array
    jge .right_sorted
    
    mov R10B, [array + rsi + R8]
    mov R11B, [array + R12]
    
    ; 부호 없는 비교
    cmp R10B, R11B
    jb .left_smaller  ; R10B가 R11B보다 작은 경우
    jae .right_smaller  ; R10B가 R11B보다 크거나 같은 경우

.left_smaller:
    xor R12, R12
    add R12, R8
    add R12, R9
    mov [temp_array + rsi + R12], R10B
    add R8, 1
    cmp R8, R13     
    je .left_sorted
    jmp .sort_loop 

.right_smaller:
    xor R12, R12
    add R12, R8
    add R12, R9
    mov [temp_array + rsi + R12], R11B
    add R9, 1 
    cmp R9, R13     
    je .right_sorted
    jmp .sort_loop 

.left_sorted:
    xor R12, R12
    add R12, rsi
    add R12, R13
    add R12, R9
    mov R10B, [array+R12]
    xor R12, R12
    add R12, R8
    add R12, R9
    mov [temp_array + rsi + R12], R10B
    add R9, 1
    cmp R9, R13     
    je .array_sorted
    jmp .left_sorted

.right_sorted:
    mov R10B, [array+rsi+R8]
    xor R12, R12
    add R12, R8
    add R12, R9
    mov [temp_array + rsi + R12], R10B
    add R8, 1
    cmp R8, R13     
    je .array_sorted
    jmp .right_sorted

.array_sorted:  
    add rsi, R13
    add rsi, R13
    xor R8, R8  ; left 배열 포인터
    xor R9, R9  ; right 배열 포인터
    
    cmp rsi, len_of_array
    jl .sort_loop

    ; temp_array의 데이터를 array로 복사
    mov R9, [temp_array]
    mov [array], R9
        mov R9, [temp_array + 7]
    mov [array + 7], R9

    add R13, R13
    xor R8, R8  ; left 배열 포인터
    xor R9, R9  ; right 배열 포인터
    xor rsi, rsi
    
    cmp R13, 16
    jne .sort_loop

    mov rcx, len_of_array


    
%macro print 2
    mov rax, 1
    mov rdi, 1
    mov rsi, %1
    mov rdx, %2
    syscall
%endmacro

print_loop:
    movzx eax, byte [array + rsi]
    call print_number

    cmp rsi, len_of_array - 1
    je .no_comma
    
    push rsi 
    mov rax, 1          
    mov rdi, 1          
    mov rsi, comma + 100      
    mov rdx, 1         
    syscall             
    pop rsi
    
.no_comma:
    inc rsi                        
    cmp rsi, len_of_array
    jl print_loop               
    
    mov eax, 60                    
    xor edi, edi                  
    syscall                        

print_number:
    push rsi
    push rcx

    mov rdi, num_string + 5        
    mov byte [rdi], 0              
    mov rcx, 10                   
    
convert_loop:
    dec rdi                      
    xor rdx, rdx                  
    div rcx                     
    add dl, '0'                   
    mov [rdi], dl                  
    test rax, rax                  
    jnz convert_loop              

    mov rsi, rdi                  
    lea rdx, [num_string + 6]      
    sub rdx, rsi                   
    print rsi, rdx                 

    pop rcx
    pop rsi
    ret

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: