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
To embed this project on your website, copy the following code and paste it into your website's HTML: