section .data
; Використовуємо 64-бітні числа (dq = 8 байт)
SourceArray dq 120, 5, 45, 10, 2, 8, 300, 15, 1, 99
; Обчислення довжини: (поточна адреса - початок) / 8 байт
ArrayLen equ ($ - SourceArray) / 8
section .text
global _start
_start:
; --- Підготовка аргументів для процедури ---
; За конвенцією Linux x64 (System V ABI):
; RDI = 1-й аргумент (Адреса масиву)
; RSI = 2-й аргумент (Кількість елементів)
mov rdi, SourceArray
mov rsi, ArrayLen
call SortProcedure
; --- Завершення програми (sys_exit) ---
mov rax, 60 ; Номер системного виклику sys_exit = 60
xor rdi, rdi ; Код повернення 0 (успіх)
syscall
; ---------------------------------------------
; Процедура сортування Bubble Sort
; Вхід: RDI = адреса масиву, RSI = довжина
; ---------------------------------------------
SortProcedure:
; Збереження регістрів, які ми будемо змінювати (згідно ABI RBX зберігається callee)
push rbx
push rcx
push rdx
mov rcx, rsi ; RCX = лічильник зовнішнього циклу (довжина)
cmp rcx, 1 ; Якщо елементів <= 1, виходимо
jle DoneSort
dec rcx ; N - 1 проходів
OuterLoop:
push rcx ; Зберігаємо лічильник зовнішнього циклу
mov rbx, rdi ; RBX = копія адреси початку масиву
; Ми будемо рухати RBX, а RDI хай лишається базою
InnerLoop:
mov rax, [rbx] ; Завантажуємо поточне число (8 байт)
cmp rax, [rbx+8] ; Порівнюємо з наступним (зсув +8, бо 64 біти)
jle NoSwap ; Якщо порядок правильний, пропускаємо
; Обмін (Swap)
xchg rax, [rbx+8] ; Міняємо місцями
mov [rbx], rax
NoSwap:
add rbx, 8 ; Переходимо до наступного елемента (+8 байт)
loop InnerLoop ; dec rcx, if rcx != 0 goto InnerLoop
pop rcx ; Відновлюємо зовнішній лічильник
loop OuterLoop ; Перехід на наступну ітерацію зовнішнього циклу
DoneSort:
; Відновлення регістрів
pop rdx
pop rcx
pop rbx
ret
c2VjdGlvbiAuZGF0YQogICAgOyDQktC40LrQvtGA0LjRgdGC0L7QstGD0ZTQvNC+IDY0LdCx0ZbRgtC90ZYg0YfQuNGB0LvQsCAoZHEgPSA4INCx0LDQudGCKQogICAgU291cmNlQXJyYXkgZHEgMTIwLCA1LCA0NSwgMTAsIDIsIDgsIDMwMCwgMTUsIDEsIDk5CiAgICA7INCe0LHRh9C40YHQu9C10L3QvdGPINC00L7QstC20LjQvdC4OiAo0L/QvtGC0L7Rh9C90LAg0LDQtNGA0LXRgdCwIC0g0L/QvtGH0LDRgtC+0LopIC8gOCDQsdCw0LnRggogICAgQXJyYXlMZW4gICAgZXF1ICgkIC0gU291cmNlQXJyYXkpIC8gOAoKc2VjdGlvbiAudGV4dAogICAgZ2xvYmFsIF9zdGFydAoKX3N0YXJ0OgogICAgOyAtLS0g0J/RltC00LPQvtGC0L7QstC60LAg0LDRgNCz0YPQvNC10L3RgtGW0LIg0LTQu9GPINC/0YDQvtGG0LXQtNGD0YDQuCAtLS0KICAgIDsg0JfQsCDQutC+0L3QstC10L3RhtGW0ZTRjiBMaW51eCB4NjQgKFN5c3RlbSBWIEFCSSk6CiAgICA7IFJESSA9IDEt0Lkg0LDRgNCz0YPQvNC10L3RgiAo0JDQtNGA0LXRgdCwINC80LDRgdC40LLRgykKICAgIDsgUlNJID0gMi3QuSDQsNGA0LPRg9C80LXQvdGCICjQmtGW0LvRjNC60ZbRgdGC0Ywg0LXQu9C10LzQtdC90YLRltCyKQogICAgCiAgICBtb3YgcmRpLCBTb3VyY2VBcnJheQogICAgbW92IHJzaSwgQXJyYXlMZW4KCiAgICBjYWxsIFNvcnRQcm9jZWR1cmUKCiAgICA7IC0tLSDQl9Cw0LLQtdGA0YjQtdC90L3RjyDQv9GA0L7Qs9GA0LDQvNC4IChzeXNfZXhpdCkgLS0tCiAgICBtb3YgcmF4LCA2MCAgICAgICAgIDsg0J3QvtC80LXRgCDRgdC40YHRgtC10LzQvdC+0LPQviDQstC40LrQu9C40LrRgyBzeXNfZXhpdCA9IDYwCiAgICB4b3IgcmRpLCByZGkgICAgICAgIDsg0JrQvtC0INC/0L7QstC10YDQvdC10L3QvdGPIDAgKNGD0YHQv9GW0YUpCiAgICBzeXNjYWxsCgo7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo7INCf0YDQvtGG0LXQtNGD0YDQsCDRgdC+0YDRgtGD0LLQsNC90L3RjyBCdWJibGUgU29ydAo7INCS0YXRltC0OiBSREkgPSDQsNC00YDQtdGB0LAg0LzQsNGB0LjQstGDLCBSU0kgPSDQtNC+0LLQttC40L3QsAo7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpTb3J0UHJvY2VkdXJlOgogICAgOyDQl9Cx0LXRgNC10LbQtdC90L3RjyDRgNC10LPRltGB0YLRgNGW0LIsINGP0LrRliDQvNC4INCx0YPQtNC10LzQviDQt9C80ZbQvdGO0LLQsNGC0LggKNC30LPRltC00L3QviBBQkkgUkJYINC30LHQtdGA0ZbQs9Cw0ZTRgtGM0YHRjyBjYWxsZWUpCiAgICBwdXNoIHJieAogICAgcHVzaCByY3gKICAgIHB1c2ggcmR4CiAgICAKICAgIG1vdiByY3gsIHJzaSAgICAgICAgOyBSQ1ggPSDQu9GW0YfQuNC70YzQvdC40Log0LfQvtCy0L3RltGI0L3RjNC+0LPQviDRhtC40LrQu9GDICjQtNC+0LLQttC40L3QsCkKICAgIAogICAgY21wIHJjeCwgMSAgICAgICAgICA7INCv0LrRidC+INC10LvQtdC80LXQvdGC0ZbQsiA8PSAxLCDQstC40YXQvtC00LjQvNC+CiAgICBqbGUgRG9uZVNvcnQKICAgIAogICAgZGVjIHJjeCAgICAgICAgICAgICA7IE4gLSAxINC/0YDQvtGF0L7QtNGW0LIKCk91dGVyTG9vcDoKICAgIHB1c2ggcmN4ICAgICAgICAgICAgOyDQl9Cx0LXRgNGW0LPQsNGU0LzQviDQu9GW0YfQuNC70YzQvdC40Log0LfQvtCy0L3RltGI0L3RjNC+0LPQviDRhtC40LrQu9GDCiAgICAKICAgIG1vdiByYngsIHJkaSAgICAgICAgOyBSQlggPSDQutC+0L/RltGPINCw0LTRgNC10YHQuCDQv9C+0YfQsNGC0LrRgyDQvNCw0YHQuNCy0YMKICAgICAgICAgICAgICAgICAgICAgICAgOyDQnNC4INCx0YPQtNC10LzQviDRgNGD0YXQsNGC0LggUkJYLCDQsCBSREkg0YXQsNC5INC70LjRiNCw0ZTRgtGM0YHRjyDQsdCw0LfQvtGOCgpJbm5lckxvb3A6CiAgICBtb3YgcmF4LCBbcmJ4XSAgICAgIDsg0JfQsNCy0LDQvdGC0LDQttGD0ZTQvNC+INC/0L7RgtC+0YfQvdC1INGH0LjRgdC70L4gKDgg0LHQsNC50YIpCiAgICBjbXAgcmF4LCBbcmJ4KzhdICAgIDsg0J/QvtGA0ZbQstC90Y7RlNC80L4g0Lcg0L3QsNGB0YLRg9C/0L3QuNC8ICjQt9GB0YPQsiArOCwg0LHQviA2NCDQsdGW0YLQuCkKICAgIGpsZSBOb1N3YXAgICAgICAgICAgOyDQr9C60YnQviDQv9C+0YDRj9C00L7QuiDQv9GA0LDQstC40LvRjNC90LjQuSwg0L/RgNC+0L/Rg9GB0LrQsNGU0LzQvgogICAgCiAgICA7INCe0LHQvNGW0L0gKFN3YXApCiAgICB4Y2hnIHJheCwgW3JieCs4XSAgIDsg0JzRltC90Y/RlNC80L4g0LzRltGB0YbRj9C80LgKICAgIG1vdiBbcmJ4XSwgcmF4CgpOb1N3YXA6CiAgICBhZGQgcmJ4LCA4ICAgICAgICAgIDsg0J/QtdGA0LXRhdC+0LTQuNC80L4g0LTQviDQvdCw0YHRgtGD0L/QvdC+0LPQviDQtdC70LXQvNC10L3RgtCwICgrOCDQsdCw0LnRgikKICAgIGxvb3AgSW5uZXJMb29wICAgICAgOyBkZWMgcmN4LCBpZiByY3ggIT0gMCBnb3RvIElubmVyTG9vcAoKICAgIHBvcCByY3ggICAgICAgICAgICAgOyDQktGW0LTQvdC+0LLQu9GO0ZTQvNC+INC30L7QstC90ZbRiNC90ZbQuSDQu9GW0YfQuNC70YzQvdC40LoKICAgIGxvb3AgT3V0ZXJMb29wICAgICAgOyDQn9C10YDQtdGF0ZbQtCDQvdCwINC90LDRgdGC0YPQv9C90YMg0ZbRgtC10YDQsNGG0ZbRjiDQt9C+0LLQvdGW0YjQvdGM0L7Qs9C+INGG0LjQutC70YMKCkRvbmVTb3J0OgogICAgOyDQktGW0LTQvdC+0LLQu9C10L3QvdGPINGA0LXQs9GW0YHRgtGA0ZbQsgogICAgcG9wIHJkeAogICAgcG9wIHJjeAogICAgcG9wIHJieAogICAgcmV0