section .data
; Рядки для сортування
w1 db "Orange", 0
w2 db "Apple", 0
w3 db "Banana", 0
w4 db "Apricot", 0
w5 db "Zebra", 0
; Масив вказівників на ці рядки
; Використовуємо dq, бо адреси 64-бітні
ptr_array dq w1, w2, w3, w4, w5
; Обчислення кількості елементів
arr_len equ ($ - ptr_array) / 8
; Символ нового рядка для виводу
newline db 0xA
section .text
global _start
_start:
; --- 1. Сортування ---
; Передаємо параметри через стек: адресу масиву і довжину
push ptr_array
push arr_len
call bubble_sort
add rsp, 16 ; Очищаємо стек (2 аргументи * 8 байт)
; --- 2. Вивід результату ---
push ptr_array
push arr_len
call print_array
add rsp, 16 ; Очищаємо стек
; --- 3. Вихід з програми ---
mov rax, 60 ; sys_exit
xor rdi, rdi ; status 0
syscall
; ---------------------------------------------------------
; Процедура виводу (Print Array)
; Параметри в стеку: [rbp+16] = count, [rbp+24] = array pointer
; ---------------------------------------------------------
print_array:
push rbp
mov rbp, rsp
; Збережемо регістри, які будемо використовувати (callee-saved)
push rbx
push r12
mov rcx, [rbp + 16] ; Кількість слів
mov rbx, [rbp + 24] ; Адреса масиву
xor r12, r12 ; Індекс по масиву (0)
.p_loop:
push rcx ; Зберігаємо лічильник циклу
; Отримуємо вказівник на рядок: rsi = array[r12]
mov rsi, [rbx + r12*8]
; --- Рахуємо довжину рядка ---
xor rdx, rdx ; RDX буде лічильником довжини
.calc_len:
cmp byte [rsi + rdx], 0 ; Чи кінець рядка?
je .do_print
inc rdx
jmp .calc_len
.do_print:
; --- Виводимо слово ---
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
; rsi вже має адресу рядка
; rdx вже має довжину
syscall
; --- Виводимо перенос рядка ---
mov rax, 1
mov rdi, 1
mov rsi, newline
mov rdx, 1
syscall
pop rcx ; Відновлюємо лічильник циклу
inc r12 ; Наступний елемент масиву
dec rcx
jnz .p_loop
; Відновлюємо регістри
pop r12
pop rbx
mov rsp, rbp
pop rbp
ret
; ---------------------------------------------------------
; Процедура сортування (Bubble Sort)
; Параметри: [rbp+16] = count, [rbp+24] = array pointer
; ---------------------------------------------------------
bubble_sort:
push rbp
mov rbp, rsp
mov rcx, [rbp + 16] ; Кількість елементів
dec rcx ; N-1
cmp rcx, 0
jle .bs_done
mov rbx, [rbp + 24] ; Адреса масиву
.bs_outer:
push rcx
mov rdx, rcx ; Лічильник внутрішнього циклу
xor rsi, rsi ; Індекс (0)
.bs_inner:
; Завантажуємо два сусідні вказівники
mov rdi, [rbx + rsi*8] ; Вказівник 1
mov rax, [rbx + rsi*8 + 8] ; Вказівник 2
; Зберігаємо контекст перед викликом порівняння
push rsi
push rdx
push rcx
push rbx
push rax ; Зберігаємо RAX, бо він зміниться
mov rsi, rax ; Другий аргумент для str_compare
call str_compare
; Результат в RAX: >0 якщо рядок1 > рядок2
; Відновлюємо
pop r8 ; Це був старий rax, забираємо в r8, щоб не затерти результат порівняння
pop rbx
pop rcx
pop rdx
pop rsi
cmp rax, 0
jle .bs_noswap ; Якщо порядок правильний, пропускаємо
; Обмін (Swap) вказівників у масиві
; rdi = ptr1, r8 = ptr2 (ми відновили його зі стеку)
mov [rbx + rsi*8], r8
mov [rbx + rsi*8 + 8], rdi
.bs_noswap:
inc rsi
dec rdx
jnz .bs_inner
pop rcx
loop .bs_outer
.bs_done:
mov rsp, rbp
pop rbp
ret
; ---------------------------------------------------------
; Вхід: RDI = str1, RSI = str2
; Вихід: RAX > 0 якщо str1 > str2, < 0 якщо str1 < str2
; ---------------------------------------------------------
str_compare:
xor rax, rax
.cmp_loop:
mov al, byte [rdi]
mov bl, byte [rsi]
cmp al, bl
jne .cmp_diff ; Знайшли різницю
test al, al ; Чи кінець рядка (0)?
jz .cmp_equal ; Рядки ідентичні
inc rdi
inc rsi
jmp .cmp_loop
.cmp_diff:
sub al, bl
movsx rax, al ; Розширюємо результат до 64 біт зі знаком
ret
.cmp_equal:
xor rax, rax
ret
c2VjdGlvbiAuZGF0YQogICAgOyDQoNGP0LTQutC4INC00LvRjyDRgdC+0YDRgtGD0LLQsNC90L3RjwogICAgdzEgZGIgIk9yYW5nZSIsIDAKICAgIHcyIGRiICJBcHBsZSIsIDAKICAgIHczIGRiICJCYW5hbmEiLCAwCiAgICB3NCBkYiAiQXByaWNvdCIsIDAKICAgIHc1IGRiICJaZWJyYSIsIDAKICAgIAogICAgOyDQnNCw0YHQuNCyINCy0LrQsNC30ZbQstC90LjQutGW0LIg0L3QsCDRhtGWINGA0Y/QtNC60LgKICAgIDsg0JLQuNC60L7RgNC40YHRgtC+0LLRg9GU0LzQviBkcSwg0LHQviDQsNC00YDQtdGB0LggNjQt0LHRltGC0L3RlgogICAgcHRyX2FycmF5IGRxIHcxLCB3MiwgdzMsIHc0LCB3NQogICAgCiAgICA7INCe0LHRh9C40YHQu9C10L3QvdGPINC60ZbQu9GM0LrQvtGB0YLRliDQtdC70LXQvNC10L3RgtGW0LIKICAgIGFycl9sZW4gZXF1ICgkIC0gcHRyX2FycmF5KSAvIDgKCiAgICA7INCh0LjQvNCy0L7QuyDQvdC+0LLQvtCz0L4g0YDRj9C00LrQsCDQtNC70Y8g0LLQuNCy0L7QtNGDCiAgICBuZXdsaW5lIGRiIDB4QQoKc2VjdGlvbiAudGV4dAogICAgZ2xvYmFsIF9zdGFydAoKX3N0YXJ0OgogICAgOyAtLS0gMS4g0KHQvtGA0YLRg9Cy0LDQvdC90Y8gLS0tCiAgICA7INCf0LXRgNC10LTQsNGU0LzQviDQv9Cw0YDQsNC80LXRgtGA0Lgg0YfQtdGA0LXQtyDRgdGC0LXQujog0LDQtNGA0LXRgdGDINC80LDRgdC40LLRgyDRliDQtNC+0LLQttC40L3RgwogICAgcHVzaCBwdHJfYXJyYXkKICAgIHB1c2ggYXJyX2xlbgogICAgY2FsbCBidWJibGVfc29ydAogICAgYWRkIHJzcCwgMTYgICAgICA7INCe0YfQuNGJ0LDRlNC80L4g0YHRgtC10LogKDIg0LDRgNCz0YPQvNC10L3RgtC4ICogOCDQsdCw0LnRgikKCiAgICA7IC0tLSAyLiDQktC40LLRltC0INGA0LXQt9GD0LvRjNGC0LDRgtGDIC0tLQogICAgcHVzaCBwdHJfYXJyYXkKICAgIHB1c2ggYXJyX2xlbgogICAgY2FsbCBwcmludF9hcnJheQogICAgYWRkIHJzcCwgMTYgICAgICA7INCe0YfQuNGJ0LDRlNC80L4g0YHRgtC10LoKCiAgICA7IC0tLSAzLiDQktC40YXRltC0INC3INC/0YDQvtCz0YDQsNC80LggLS0tCiAgICBtb3YgcmF4LCA2MCAgICAgIDsgc3lzX2V4aXQKICAgIHhvciByZGksIHJkaSAgICAgOyBzdGF0dXMgMAogICAgc3lzY2FsbAoKOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KOyDQn9GA0L7RhtC10LTRg9GA0LAg0LLQuNCy0L7QtNGDIChQcmludCBBcnJheSkKOyDQn9Cw0YDQsNC80LXRgtGA0Lgg0LIg0YHRgtC10LrRgzogW3JicCsxNl0gPSBjb3VudCwgW3JicCsyNF0gPSBhcnJheSBwb2ludGVyCjsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnByaW50X2FycmF5OgogICAgcHVzaCByYnAKICAgIG1vdiByYnAsIHJzcAogICAgCiAgICA7INCX0LHQtdGA0LXQttC10LzQviDRgNC10LPRltGB0YLRgNC4LCDRj9C60ZYg0LHRg9C00LXQvNC+INCy0LjQutC+0YDQuNGB0YLQvtCy0YPQstCw0YLQuCAoY2FsbGVlLXNhdmVkKQogICAgcHVzaCByYngKICAgIHB1c2ggcjEyCgogICAgbW92IHJjeCwgW3JicCArIDE2XSAgICAgOyDQmtGW0LvRjNC60ZbRgdGC0Ywg0YHQu9GW0LIKICAgIG1vdiByYngsIFtyYnAgKyAyNF0gICAgIDsg0JDQtNGA0LXRgdCwINC80LDRgdC40LLRgwogICAgeG9yIHIxMiwgcjEyICAgICAgICAgICAgOyDQhtC90LTQtdC60YEg0L/QviDQvNCw0YHQuNCy0YMgKDApCgoucF9sb29wOgogICAgcHVzaCByY3ggICAgICAgICAgICAgICAgOyDQl9Cx0LXRgNGW0LPQsNGU0LzQviDQu9GW0YfQuNC70YzQvdC40Log0YbQuNC60LvRgwogICAgCiAgICA7INCe0YLRgNC40LzRg9GU0LzQviDQstC60LDQt9GW0LLQvdC40Log0L3QsCDRgNGP0LTQvtC6OiByc2kgPSBhcnJheVtyMTJdCiAgICBtb3YgcnNpLCBbcmJ4ICsgcjEyKjhdCiAgICAKICAgIDsgLS0tINCg0LDRhdGD0ZTQvNC+INC00L7QstC20LjQvdGDINGA0Y/QtNC60LAgLS0tCiAgICB4b3IgcmR4LCByZHggICAgICAgICAgICA7IFJEWCDQsdGD0LTQtSDQu9GW0YfQuNC70YzQvdC40LrQvtC8INC00L7QstC20LjQvdC4Ci5jYWxjX2xlbjoKICAgIGNtcCBieXRlIFtyc2kgKyByZHhdLCAwIDsg0KfQuCDQutGW0L3QtdGG0Ywg0YDRj9C00LrQsD8KICAgIGplIC5kb19wcmludAogICAgaW5jIHJkeAogICAgam1wIC5jYWxjX2xlbgoKLmRvX3ByaW50OgogICAgOyAtLS0g0JLQuNCy0L7QtNC40LzQviDRgdC70L7QstC+IC0tLQogICAgbW92IHJheCwgMSAgICAgICAgICAgICAgOyBzeXNfd3JpdGUKICAgIG1vdiByZGksIDEgICAgICAgICAgICAgIDsgc3Rkb3V0CiAgICA7IHJzaSDQstC20LUg0LzQsNGUINCw0LTRgNC10YHRgyDRgNGP0LTQutCwCiAgICA7IHJkeCDQstC20LUg0LzQsNGUINC00L7QstC20LjQvdGDCiAgICBzeXNjYWxsCgogICAgOyAtLS0g0JLQuNCy0L7QtNC40LzQviDQv9C10YDQtdC90L7RgSDRgNGP0LTQutCwIC0tLQogICAgbW92IHJheCwgMQogICAgbW92IHJkaSwgMQogICAgbW92IHJzaSwgbmV3bGluZQogICAgbW92IHJkeCwgMQogICAgc3lzY2FsbAoKICAgIHBvcCByY3ggICAgICAgICAgICAgICAgIDsg0JLRltC00L3QvtCy0LvRjtGU0LzQviDQu9GW0YfQuNC70YzQvdC40Log0YbQuNC60LvRgwogICAgaW5jIHIxMiAgICAgICAgICAgICAgICAgOyDQndCw0YHRgtGD0L/QvdC40Lkg0LXQu9C10LzQtdC90YIg0LzQsNGB0LjQstGDCiAgICBkZWMgcmN4CiAgICBqbnogLnBfbG9vcAoKICAgIDsg0JLRltC00L3QvtCy0LvRjtGU0LzQviDRgNC10LPRltGB0YLRgNC4CiAgICBwb3AgcjEyCiAgICBwb3AgcmJ4CiAgICAKICAgIG1vdiByc3AsIHJicAogICAgcG9wIHJicAogICAgcmV0Cgo7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo7INCf0YDQvtGG0LXQtNGD0YDQsCDRgdC+0YDRgtGD0LLQsNC90L3RjyAoQnViYmxlIFNvcnQpCjsg0J/QsNGA0LDQvNC10YLRgNC4OiBbcmJwKzE2XSA9IGNvdW50LCBbcmJwKzI0XSA9IGFycmF5IHBvaW50ZXIKOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYnViYmxlX3NvcnQ6CiAgICBwdXNoIHJicAogICAgbW92IHJicCwgcnNwCgogICAgbW92IHJjeCwgW3JicCArIDE2XSAgICAgOyDQmtGW0LvRjNC60ZbRgdGC0Ywg0LXQu9C10LzQtdC90YLRltCyCiAgICBkZWMgcmN4ICAgICAgICAgICAgICAgICA7IE4tMQogICAgY21wIHJjeCwgMAogICAgamxlIC5ic19kb25lCgogICAgbW92IHJieCwgW3JicCArIDI0XSAgICAgOyDQkNC00YDQtdGB0LAg0LzQsNGB0LjQstGDCgouYnNfb3V0ZXI6CiAgICBwdXNoIHJjeAogICAgbW92IHJkeCwgcmN4ICAgICAgICAgICAgOyDQm9GW0YfQuNC70YzQvdC40Log0LLQvdGD0YLRgNGW0YjQvdGM0L7Qs9C+INGG0LjQutC70YMKICAgIHhvciByc2ksIHJzaSAgICAgICAgICAgIDsg0IbQvdC00LXQutGBICgwKQoKLmJzX2lubmVyOgogICAgOyDQl9Cw0LLQsNC90YLQsNC20YPRlNC80L4g0LTQstCwINGB0YPRgdGW0LTQvdGWINCy0LrQsNC30ZbQstC90LjQutC4CiAgICBtb3YgcmRpLCBbcmJ4ICsgcnNpKjhdICAgICA7INCS0LrQsNC30ZbQstC90LjQuiAxCiAgICBtb3YgcmF4LCBbcmJ4ICsgcnNpKjggKyA4XSA7INCS0LrQsNC30ZbQstC90LjQuiAyCiAgICAKICAgIDsg0JfQsdC10YDRltCz0LDRlNC80L4g0LrQvtC90YLQtdC60YHRgiDQv9C10YDQtdC0INCy0LjQutC70LjQutC+0Lwg0L/QvtGA0ZbQstC90Y/QvdC90Y8KICAgIHB1c2ggcnNpCiAgICBwdXNoIHJkeAogICAgcHVzaCByY3gKICAgIHB1c2ggcmJ4CiAgICBwdXNoIHJheCA7INCX0LHQtdGA0ZbQs9Cw0ZTQvNC+IFJBWCwg0LHQviDQstGW0L0g0LfQvNGW0L3QuNGC0YzRgdGPCiAgICAKICAgIG1vdiByc2ksIHJheCA7INCU0YDRg9Cz0LjQuSDQsNGA0LPRg9C80LXQvdGCINC00LvRjyBzdHJfY29tcGFyZQogICAgY2FsbCBzdHJfY29tcGFyZQogICAgOyDQoNC10LfRg9C70YzRgtCw0YIg0LIgUkFYOiA+MCDRj9C60YnQviDRgNGP0LTQvtC6MSA+INGA0Y/QtNC+0LoyCgogICAgOyDQktGW0LTQvdC+0LLQu9GO0ZTQvNC+CiAgICBwb3AgcjggIDsg0KbQtSDQsdGD0LIg0YHRgtCw0YDQuNC5IHJheCwg0LfQsNCx0LjRgNCw0ZTQvNC+INCyIHI4LCDRidC+0LEg0L3QtSDQt9Cw0YLQtdGA0YLQuCDRgNC10LfRg9C70YzRgtCw0YIg0L/QvtGA0ZbQstC90Y/QvdC90Y8KICAgIHBvcCByYngKICAgIHBvcCByY3gKICAgIHBvcCByZHgKICAgIHBvcCByc2kKCiAgICBjbXAgcmF4LCAwCiAgICBqbGUgLmJzX25vc3dhcCAgICAgICAgICA7INCv0LrRidC+INC/0L7RgNGP0LTQvtC6INC/0YDQsNCy0LjQu9GM0L3QuNC5LCDQv9GA0L7Qv9GD0YHQutCw0ZTQvNC+CgogICAgOyDQntCx0LzRltC9IChTd2FwKSDQstC60LDQt9GW0LLQvdC40LrRltCyINGDINC80LDRgdC40LLRlgogICAgOyByZGkgPSBwdHIxLCByOCA9IHB0cjIgKNC80Lgg0LLRltC00L3QvtCy0LjQu9C4INC50L7Qs9C+INC30ZYg0YHRgtC10LrRgykKICAgIG1vdiBbcmJ4ICsgcnNpKjhdLCByOAogICAgbW92IFtyYnggKyByc2kqOCArIDhdLCByZGkKCi5ic19ub3N3YXA6CiAgICBpbmMgcnNpCiAgICBkZWMgcmR4CiAgICBqbnogLmJzX2lubmVyCgogICAgcG9wIHJjeAogICAgbG9vcCAuYnNfb3V0ZXIKCi5ic19kb25lOgogICAgbW92IHJzcCwgcmJwCiAgICBwb3AgcmJwCiAgICByZXQKCjsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjsg0J/QvtGA0ZbQstC90Y/QvdC90Y8g0YDRj9C00LrRltCyIHN0cmNtcAo7INCS0YXRltC0OiBSREkgPSBzdHIxLCBSU0kgPSBzdHIyCjsg0JLQuNGF0ZbQtDogUkFYID4gMCDRj9C60YnQviBzdHIxID4gc3RyMiwgPCAwINGP0LrRidC+IHN0cjEgPCBzdHIyCjsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0cl9jb21wYXJlOgogICAgeG9yIHJheCwgcmF4Ci5jbXBfbG9vcDoKICAgIG1vdiBhbCwgYnl0ZSBbcmRpXQogICAgbW92IGJsLCBieXRlIFtyc2ldCiAgICAKICAgIGNtcCBhbCwgYmwKICAgIGpuZSAuY21wX2RpZmYgICAgICAgOyDQl9C90LDQudGI0LvQuCDRgNGW0LfQvdC40YbRjgogICAgCiAgICB0ZXN0IGFsLCBhbCAgICAgICAgIDsg0KfQuCDQutGW0L3QtdGG0Ywg0YDRj9C00LrQsCAoMCk/CiAgICBqeiAuY21wX2VxdWFsICAgICAgIDsg0KDRj9C00LrQuCDRltC00LXQvdGC0LjRh9C90ZYKICAgIAogICAgaW5jIHJkaQogICAgaW5jIHJzaQogICAgam1wIC5jbXBfbG9vcAoKLmNtcF9kaWZmOgogICAgc3ViIGFsLCBibAogICAgbW92c3ggcmF4LCBhbCAgICAgICA7INCg0L7Qt9GI0LjRgNGO0ZTQvNC+INGA0LXQt9GD0LvRjNGC0LDRgiDQtNC+IDY0INCx0ZbRgiDQt9GWINC30L3QsNC60L7QvAogICAgcmV0CgouY21wX2VxdWFsOgogICAgeG9yIHJheCwgcmF4CiAgICByZXQM