section .data
; Варіант 19: Масив слів (dw = 2 байти)
SourceArray dw 120, 5, 45, 10, 2, 8, 300, 15, 1, 99
; Рахуємо кількість елементів
ArrayLen equ ($ - SourceArray) / 2
section .text
global _start
_start:
; --- ПІДГОТОВКА СТЕКУ ---
; ВАЖЛИВО: У 64-бітній системі стек працює блоками по 8 байт (qword)
push qword ArrayLen ; Параметр 1: Кількість елементів
lea rax, [SourceArray] ; Завантажуємо адресу в 64-бітний регістр RAX
push rax ; Параметр 2: Адреса початку масиву
call SortProcedure ; Виклик процедури
; Очищення стеку (2 параметри * 8 байт = 16 байт)
add rsp, 16
; --- ВИХІД З ПРОГРАМИ (Linux syscall 60) ---
mov rax, 60 ; Номер функції sys_exit
xor rdi, rdi ; Код повернення 0
syscall
; =========================================================
; Процедура сортування (Bubble Sort)
; Вхідні параметри (через стек):
; [rbp+16] -> Адреса масиву (64-бітний вказівник)
; [rbp+24] -> Кількість елементів
; =========================================================
SortProcedure:
push rbp
mov rbp, rsp
; Зберігаємо регістри, які будемо використовувати
push rbx
push rcx
push rdx
push rsi
push rdi
; Отримуємо параметри зі стеку
mov rbx, [rbp+16] ; RBX = Адреса масиву (ТІЛЬКИ RBX, не BX!)
mov rcx, [rbp+24] ; RCX = Кількість елементів
cmp rcx, 1 ; Якщо 1 або 0 елементів - виходимо
jle EndSort
dec rcx ; Кількість проходів = N-1
OuterLoop:
push rcx ; Зберігаємо лічильник зовнішнього циклу
mov rsi, rbx ; RSI = Поточна адреса (ТІЛЬКИ RSI, не SI!)
InnerLoop:
; Читаємо слово (2 байти), але адресу беремо з 64-бітного регістра RSI
mov ax, [rsi]
cmp ax, [rsi+2] ; Порівнюємо з наступним словом
jle NoSwap ; Якщо порядок вірний - пропускаємо
; Обмін елементів (Swap)
xchg ax, [rsi+2]
mov [rsi], ax
NoSwap:
add rsi, 2 ; Переходимо до наступного слова (+2 байти)
dec rcx ; Зменшуємо лічильник
jnz InnerLoop ; Якщо не нуль, повторюємо
pop rcx ; Відновлюємо лічильник зовнішнього циклу
dec rcx
jnz OuterLoop ; Наступний прохід
EndSort:
; Відновлюємо регістри перед виходом
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
pop rbp
ret
c2VjdGlvbiAuZGF0YQogICAgOyDQktCw0YDRltCw0L3RgiAxOTog0JzQsNGB0LjQsiDRgdC70ZbQsiAoZHcgPSAyINCx0LDQudGC0LgpCiAgICBTb3VyY2VBcnJheSBkdyAxMjAsIDUsIDQ1LCAxMCwgMiwgOCwgMzAwLCAxNSwgMSwgOTkKICAgIAogICAgOyDQoNCw0YXRg9GU0LzQviDQutGW0LvRjNC60ZbRgdGC0Ywg0LXQu9C10LzQtdC90YLRltCyCiAgICBBcnJheUxlbiAgICBlcXUgKCQgLSBTb3VyY2VBcnJheSkgLyAyCgpzZWN0aW9uIC50ZXh0CiAgICBnbG9iYWwgX3N0YXJ0Cgpfc3RhcnQ6CiAgICA7IC0tLSDQn9CG0JTQk9Ce0KLQntCS0JrQkCDQodCi0JXQmtCjIC0tLQogICAgOyDQktCQ0JbQm9CY0JLQnjog0KMgNjQt0LHRltGC0L3RltC5INGB0LjRgdGC0LXQvNGWINGB0YLQtdC6INC/0YDQsNGG0Y7RlCDQsdC70L7QutCw0LzQuCDQv9C+IDgg0LHQsNC50YIgKHF3b3JkKQogICAgCiAgICBwdXNoIHF3b3JkIEFycmF5TGVuICAgIDsg0J/QsNGA0LDQvNC10YLRgCAxOiDQmtGW0LvRjNC60ZbRgdGC0Ywg0LXQu9C10LzQtdC90YLRltCyCiAgICBsZWEgcmF4LCBbU291cmNlQXJyYXldIDsg0JfQsNCy0LDQvdGC0LDQttGD0ZTQvNC+INCw0LTRgNC10YHRgyDQsiA2NC3QsdGW0YLQvdC40Lkg0YDQtdCz0ZbRgdGC0YAgUkFYCiAgICBwdXNoIHJheCAgICAgICAgICAgICAgIDsg0J/QsNGA0LDQvNC10YLRgCAyOiDQkNC00YDQtdGB0LAg0L/QvtGH0LDRgtC60YMg0LzQsNGB0LjQstGDCgogICAgY2FsbCBTb3J0UHJvY2VkdXJlICAgICA7INCS0LjQutC70LjQuiDQv9GA0L7RhtC10LTRg9GA0LgKCiAgICA7INCe0YfQuNGJ0LXQvdC90Y8g0YHRgtC10LrRgyAoMiDQv9Cw0YDQsNC80LXRgtGA0LggKiA4INCx0LDQudGCID0gMTYg0LHQsNC50YIpCiAgICBhZGQgcnNwLCAxNgoKICAgIDsgLS0tINCS0JjQpdCG0JQg0Jcg0J/QoNCe0JPQoNCQ0JzQmCAoTGludXggc3lzY2FsbCA2MCkgLS0tCiAgICBtb3YgcmF4LCA2MCAgICAgICAgICAgIDsg0J3QvtC80LXRgCDRhNGD0L3QutGG0ZbRlyBzeXNfZXhpdAogICAgeG9yIHJkaSwgcmRpICAgICAgICAgICA7INCa0L7QtCDQv9C+0LLQtdGA0L3QtdC90L3RjyAwCiAgICBzeXNjYWxsCgo7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo7INCf0YDQvtGG0LXQtNGD0YDQsCDRgdC+0YDRgtGD0LLQsNC90L3RjyAoQnViYmxlIFNvcnQpCjsg0JLRhdGW0LTQvdGWINC/0LDRgNCw0LzQtdGC0YDQuCAo0YfQtdGA0LXQtyDRgdGC0LXQuik6CjsgICBbcmJwKzE2XSAtPiDQkNC00YDQtdGB0LAg0LzQsNGB0LjQstGDICg2NC3QsdGW0YLQvdC40Lkg0LLQutCw0LfRltCy0L3QuNC6KQo7ICAgW3JicCsyNF0gLT4g0JrRltC70YzQutGW0YHRgtGMINC10LvQtdC80LXQvdGC0ZbQsgo7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpTb3J0UHJvY2VkdXJlOgogICAgcHVzaCByYnAKICAgIG1vdiByYnAsIHJzcAoKICAgIDsg0JfQsdC10YDRltCz0LDRlNC80L4g0YDQtdCz0ZbRgdGC0YDQuCwg0Y/QutGWINCx0YPQtNC10LzQviDQstC40LrQvtGA0LjRgdGC0L7QstGD0LLQsNGC0LgKICAgIHB1c2ggcmJ4CiAgICBwdXNoIHJjeAogICAgcHVzaCByZHgKICAgIHB1c2ggcnNpIAogICAgcHVzaCByZGkKCiAgICA7INCe0YLRgNC40LzRg9GU0LzQviDQv9Cw0YDQsNC80LXRgtGA0Lgg0LfRliDRgdGC0LXQutGDCiAgICBtb3YgcmJ4LCBbcmJwKzE2XSAgICAgIDsgUkJYID0g0JDQtNGA0LXRgdCwINC80LDRgdC40LLRgyAo0KLQhtCb0KzQmtCYIFJCWCwg0L3QtSBCWCEpCiAgICBtb3YgcmN4LCBbcmJwKzI0XSAgICAgIDsgUkNYID0g0JrRltC70YzQutGW0YHRgtGMINC10LvQtdC80LXQvdGC0ZbQsgoKICAgIGNtcCByY3gsIDEgICAgICAgICAgICAgOyDQr9C60YnQviAxINCw0LHQviAwINC10LvQtdC80LXQvdGC0ZbQsiAtINCy0LjRhdC+0LTQuNC80L4KICAgIGpsZSBFbmRTb3J0CiAgICBkZWMgcmN4ICAgICAgICAgICAgICAgIDsg0JrRltC70YzQutGW0YHRgtGMINC/0YDQvtGF0L7QtNGW0LIgPSBOLTEKCk91dGVyTG9vcDoKICAgIHB1c2ggcmN4ICAgICAgICAgICAgICAgOyDQl9Cx0LXRgNGW0LPQsNGU0LzQviDQu9GW0YfQuNC70YzQvdC40Log0LfQvtCy0L3RltGI0L3RjNC+0LPQviDRhtC40LrQu9GDCiAgICBtb3YgcnNpLCByYnggICAgICAgICAgIDsgUlNJID0g0J/QvtGC0L7Rh9C90LAg0LDQtNGA0LXRgdCwICjQotCG0JvQrNCa0JggUlNJLCDQvdC1IFNJISkKCklubmVyTG9vcDoKICAgIDsg0KfQuNGC0LDRlNC80L4g0YHQu9C+0LLQviAoMiDQsdCw0LnRgtC4KSwg0LDQu9C1INCw0LTRgNC10YHRgyDQsdC10YDQtdC80L4g0LcgNjQt0LHRltGC0L3QvtCz0L4g0YDQtdCz0ZbRgdGC0YDQsCBSU0kKICAgIG1vdiBheCwgW3JzaV0gICAgICAgICAgCiAgICBjbXAgYXgsIFtyc2krMl0gICAgICAgIDsg0J/QvtGA0ZbQstC90Y7RlNC80L4g0Lcg0L3QsNGB0YLRg9C/0L3QuNC8INGB0LvQvtCy0L7QvAogICAgamxlIE5vU3dhcCAgICAgICAgICAgICA7INCv0LrRidC+INC/0L7RgNGP0LTQvtC6INCy0ZbRgNC90LjQuSAtINC/0YDQvtC/0YPRgdC60LDRlNC80L4KCiAgICA7INCe0LHQvNGW0L0g0LXQu9C10LzQtdC90YLRltCyIChTd2FwKQogICAgeGNoZyBheCwgW3JzaSsyXQogICAgbW92IFtyc2ldLCBheAoKTm9Td2FwOgogICAgYWRkIHJzaSwgMiAgICAgICAgICAgICA7INCf0LXRgNC10YXQvtC00LjQvNC+INC00L4g0L3QsNGB0YLRg9C/0L3QvtCz0L4g0YHQu9C+0LLQsCAoKzIg0LHQsNC50YLQuCkKICAgIGRlYyByY3ggICAgICAgICAgICAgICAgOyDQl9C80LXQvdGI0YPRlNC80L4g0LvRltGH0LjQu9GM0L3QuNC6CiAgICBqbnogSW5uZXJMb29wICAgICAgICAgIDsg0K/QutGJ0L4g0L3QtSDQvdGD0LvRjCwg0L/QvtCy0YLQvtGA0Y7RlNC80L4KCiAgICBwb3AgcmN4ICAgICAgICAgICAgICAgIDsg0JLRltC00L3QvtCy0LvRjtGU0LzQviDQu9GW0YfQuNC70YzQvdC40Log0LfQvtCy0L3RltGI0L3RjNC+0LPQviDRhtC40LrQu9GDCiAgICBkZWMgcmN4CiAgICBqbnogT3V0ZXJMb29wICAgICAgICAgIDsg0J3QsNGB0YLRg9C/0L3QuNC5INC/0YDQvtGF0ZbQtAoKRW5kU29ydDoKICAgIDsg0JLRltC00L3QvtCy0LvRjtGU0LzQviDRgNC10LPRltGB0YLRgNC4INC/0LXRgNC10LQg0LLQuNGF0L7QtNC+0LwKICAgIHBvcCByZGkKICAgIHBvcCByc2kKICAgIHBvcCByZHgKICAgIHBvcCByY3gKICAgIHBvcCByYngKICAgIAogICAgcG9wIHJicAogICAgcmV0