section .data
; Варіант 19: Масив слів
SourceArray dw 120, 5, 45, 10, 2, 8, 300, 15, 1, 99
ArrayLen equ ($ - SourceArray) / 2
; Символ нового рядка для виводу
newline db 10
section .bss
; Буфер для зберігання текстового вигляду числа (макс 6 цифр для 16-біт)
numBuffer resb 10
section .text
global _start
_start:
; --- 1. СОРТУВАННЯ (Bubble Sort) ---
push qword ArrayLen ; Параметр 1: Кількість
lea rax, [SourceArray] ; Параметр 2: Адреса
push rax
call SortProcedure ; Сортуємо
add rsp, 16 ; Чистимо стек параметрів
; --- 2. ВИВІД РЕЗУЛЬТАТУ ---
; Підготовка циклу для друку
mov cx, ArrayLen ; Лічильник (кількість чисел)
lea rsi, [SourceArray] ; Вказівник на початок масиву
PrintLoop:
push rcx ; Зберігаємо лічильник циклу
push rsi ; Зберігаємо вказівник на поточне число
; Беремо число з масиву (тільки 2 байти)
xor rax, rax ; Очищаємо rax
mov ax, [rsi] ; Завантажуємо число
; Викликаємо процедуру друку числа (вона в rax)
call PrintNumber
; Друкуємо перенос рядка (щоб числа були в стовпчик)
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
lea rsi, [newline] ; адреса символу \n
mov rdx, 1 ; довжина 1 байт
syscall
pop rsi ; Відновлюємо вказівник
pop rcx ; Відновлюємо лічильник
add rsi, 2 ; Переходимо до наступного числа (+2 байти)
dec cx ; Зменшуємо лічильник
jnz PrintLoop ; Якщо не 0, повторюємо
; --- 3. ЗАВЕРШЕННЯ ---
mov rax, 60 ; sys_exit
xor rdi, rdi
syscall
; =========================================================
; Процедура: SortProcedure (Bubble Sort)
; =========================================================
SortProcedure:
push rbp
mov rbp, rsp
push rbx
push rcx
push rdx
push rsi
push rdi
mov rbx, [rbp+16] ; Адреса масиву
mov rcx, [rbp+24] ; Кількість елементів
cmp rcx, 1
jle EndSort
dec rcx
OuterLoop:
push rcx
mov rsi, rbx
InnerLoop:
mov ax, [rsi]
cmp ax, [rsi+2]
jle NoSwap
xchg ax, [rsi+2]
mov [rsi], ax
NoSwap:
add rsi, 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
; =========================================================
; Процедура: PrintNumber
; Перетворює число в RAX у рядок і друкує його
; =========================================================
PrintNumber:
push rbx
push rcx
push rdx
push rsi
push rdi
mov rcx, 0 ; Лічильник цифр
mov rbx, 10 ; Дільник = 10
DivideLoop:
xor rdx, rdx ; Очищаємо залишок
div rbx
; AX
/ 10 -> AX
=частка
, DX
=залишок
add dl, '0' ; Перетворюємо цифру в ASCII (наприклад, 5 -> '5')
push rdx ; Зберігаємо цифру в стек (бо отримуємо їх з кінця)
inc rcx ; Рахуємо кількість цифр
test rax, rax ; Якщо частка 0, кінець
jnz DivideLoop
; Тепер виводимо цифри зі стеку
; Щоб вивести, треба записати їх у буфер
lea rsi, [numBuffer] ; Адреса буфера
mov rdi, rsi ; Копія адреси для запису
PopLoop:
pop rax ; Дістаємо цифру зі стеку
mov [rdi], al ; Записуємо в буфер
inc rdi ; Зсуваємо вказівник буфера
loop PopLoop ; Повторюємо CX разів
; Виклик sys_write для всього буфера
mov rdx, rdi ; Обчислюємо довжину:
lea rax, [numBuffer]
sub rdx, rax ; rdx = поточний rdi - початок буфера (довжина рядка)
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout (консоль)
lea rsi, [numBuffer] ; адреса тексту
syscall
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
ret
c2VjdGlvbiAuZGF0YQogICAgOyDQktCw0YDRltCw0L3RgiAxOTog0JzQsNGB0LjQsiDRgdC70ZbQsgogICAgU291cmNlQXJyYXkgZHcgMTIwLCA1LCA0NSwgMTAsIDIsIDgsIDMwMCwgMTUsIDEsIDk5CiAgICBBcnJheUxlbiAgICBlcXUgKCQgLSBTb3VyY2VBcnJheSkgLyAyCiAgICAKICAgIDsg0KHQuNC80LLQvtC7INC90L7QstC+0LPQviDRgNGP0LTQutCwINC00LvRjyDQstC40LLQvtC00YMKICAgIG5ld2xpbmUgICAgIGRiIDEwIAoKc2VjdGlvbiAuYnNzCiAgICA7INCR0YPRhNC10YAg0LTQu9GPINC30LHQtdGA0ZbQs9Cw0L3QvdGPINGC0LXQutGB0YLQvtCy0L7Qs9C+INCy0LjQs9C70Y/QtNGDINGH0LjRgdC70LAgKNC80LDQutGBIDYg0YbQuNGE0YAg0LTQu9GPIDE2LdCx0ZbRgikKICAgIG51bUJ1ZmZlciAgIHJlc2IgMTAgCgpzZWN0aW9uIC50ZXh0CiAgICBnbG9iYWwgX3N0YXJ0Cgpfc3RhcnQ6CiAgICA7IC0tLSAxLiDQodCe0KDQotCj0JLQkNCd0J3QryAoQnViYmxlIFNvcnQpIC0tLQogICAgcHVzaCBxd29yZCBBcnJheUxlbiAgICA7INCf0LDRgNCw0LzQtdGC0YAgMTog0JrRltC70YzQutGW0YHRgtGMCiAgICBsZWEgcmF4LCBbU291cmNlQXJyYXldIDsg0J/QsNGA0LDQvNC10YLRgCAyOiDQkNC00YDQtdGB0LAKICAgIHB1c2ggcmF4CgogICAgY2FsbCBTb3J0UHJvY2VkdXJlICAgICA7INCh0L7RgNGC0YPRlNC80L4KICAgIGFkZCByc3AsIDE2ICAgICAgICAgICAgOyDQp9C40YHRgtC40LzQviDRgdGC0LXQuiDQv9Cw0YDQsNC80LXRgtGA0ZbQsgoKICAgIDsgLS0tIDIuINCS0JjQktCG0JQg0KDQldCX0KPQm9Cs0KLQkNCi0KMgLS0tCiAgICA7INCf0ZbQtNCz0L7RgtC+0LLQutCwINGG0LjQutC70YMg0LTQu9GPINC00YDRg9C60YMKICAgIG1vdiBjeCwgQXJyYXlMZW4gICAgICAgOyDQm9GW0YfQuNC70YzQvdC40LogKNC60ZbQu9GM0LrRltGB0YLRjCDRh9C40YHQtdC7KQogICAgbGVhIHJzaSwgW1NvdXJjZUFycmF5XSA7INCS0LrQsNC30ZbQstC90LjQuiDQvdCwINC/0L7Rh9Cw0YLQvtC6INC80LDRgdC40LLRgwoKUHJpbnRMb29wOgogICAgcHVzaCByY3ggICAgICAgICAgICAgICA7INCX0LHQtdGA0ZbQs9Cw0ZTQvNC+INC70ZbRh9C40LvRjNC90LjQuiDRhtC40LrQu9GDCiAgICBwdXNoIHJzaSAgICAgICAgICAgICAgIDsg0JfQsdC10YDRltCz0LDRlNC80L4g0LLQutCw0LfRltCy0L3QuNC6INC90LAg0L/QvtGC0L7Rh9C90LUg0YfQuNGB0LvQvgoKICAgIDsg0JHQtdGA0LXQvNC+INGH0LjRgdC70L4g0Lcg0LzQsNGB0LjQstGDICjRgtGW0LvRjNC60LggMiDQsdCw0LnRgtC4KQogICAgeG9yIHJheCwgcmF4ICAgICAgICAgICA7INCe0YfQuNGJ0LDRlNC80L4gcmF4CiAgICBtb3YgYXgsIFtyc2ldICAgICAgICAgIDsg0JfQsNCy0LDQvdGC0LDQttGD0ZTQvNC+INGH0LjRgdC70L4KCiAgICA7INCS0LjQutC70LjQutCw0ZTQvNC+INC/0YDQvtGG0LXQtNGD0YDRgyDQtNGA0YPQutGDINGH0LjRgdC70LAgKNCy0L7QvdCwINCyIHJheCkKICAgIGNhbGwgUHJpbnROdW1iZXIKCiAgICA7INCU0YDRg9C60YPRlNC80L4g0L/QtdGA0LXQvdC+0YEg0YDRj9C00LrQsCAo0YnQvtCxINGH0LjRgdC70LAg0LHRg9C70Lgg0LIg0YHRgtC+0LLQv9GH0LjQuikKICAgIG1vdiByYXgsIDEgICAgICAgICAgICAgOyBzeXNfd3JpdGUKICAgIG1vdiByZGksIDEgICAgICAgICAgICAgOyBzdGRvdXQKICAgIGxlYSByc2ksIFtuZXdsaW5lXSAgICAgOyDQsNC00YDQtdGB0LAg0YHQuNC80LLQvtC70YMgXG4KICAgIG1vdiByZHgsIDEgICAgICAgICAgICAgOyDQtNC+0LLQttC40L3QsCAxINCx0LDQudGCCiAgICBzeXNjYWxsCgogICAgcG9wIHJzaSAgICAgICAgICAgICAgICA7INCS0ZbQtNC90L7QstC70Y7RlNC80L4g0LLQutCw0LfRltCy0L3QuNC6CiAgICBwb3AgcmN4ICAgICAgICAgICAgICAgIDsg0JLRltC00L3QvtCy0LvRjtGU0LzQviDQu9GW0YfQuNC70YzQvdC40LoKCiAgICBhZGQgcnNpLCAyICAgICAgICAgICAgIDsg0J/QtdGA0LXRhdC+0LTQuNC80L4g0LTQviDQvdCw0YHRgtGD0L/QvdC+0LPQviDRh9C40YHQu9CwICgrMiDQsdCw0LnRgtC4KQogICAgZGVjIGN4ICAgICAgICAgICAgICAgICA7INCX0LzQtdC90YjRg9GU0LzQviDQu9GW0YfQuNC70YzQvdC40LoKICAgIGpueiBQcmludExvb3AgICAgICAgICAgOyDQr9C60YnQviDQvdC1IDAsINC/0L7QstGC0L7RgNGO0ZTQvNC+CgogICAgOyAtLS0gMy4g0JfQkNCS0JXQoNCo0JXQndCd0K8gLS0tCiAgICBtb3YgcmF4LCA2MCAgICAgICAgICAgIDsgc3lzX2V4aXQKICAgIHhvciByZGksIHJkaQogICAgc3lzY2FsbAoKOyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KOyDQn9GA0L7RhtC10LTRg9GA0LA6IFNvcnRQcm9jZWR1cmUgKEJ1YmJsZSBTb3J0KQo7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpTb3J0UHJvY2VkdXJlOgogICAgcHVzaCByYnAKICAgIG1vdiByYnAsIHJzcAogICAgcHVzaCByYngKICAgIHB1c2ggcmN4CiAgICBwdXNoIHJkeAogICAgcHVzaCByc2kKICAgIHB1c2ggcmRpCgogICAgbW92IHJieCwgW3JicCsxNl0gICAgICA7INCQ0LTRgNC10YHQsCDQvNCw0YHQuNCy0YMKICAgIG1vdiByY3gsIFtyYnArMjRdICAgICAgOyDQmtGW0LvRjNC60ZbRgdGC0Ywg0LXQu9C10LzQtdC90YLRltCyCgogICAgY21wIHJjeCwgMQogICAgamxlIEVuZFNvcnQKICAgIGRlYyByY3gKCk91dGVyTG9vcDoKICAgIHB1c2ggcmN4CiAgICBtb3YgcnNpLCByYngKCklubmVyTG9vcDoKICAgIG1vdiBheCwgW3JzaV0KICAgIGNtcCBheCwgW3JzaSsyXQogICAgamxlIE5vU3dhcAoKICAgIHhjaGcgYXgsIFtyc2krMl0KICAgIG1vdiBbcnNpXSwgYXgKCk5vU3dhcDoKICAgIGFkZCByc2ksIDIKICAgIGRlYyByY3gKICAgIGpueiBJbm5lckxvb3AKCiAgICBwb3AgcmN4CiAgICBkZWMgcmN4CiAgICBqbnogT3V0ZXJMb29wCgpFbmRTb3J0OgogICAgcG9wIHJkaQogICAgcG9wIHJzaQogICAgcG9wIHJkeAogICAgcG9wIHJjeAogICAgcG9wIHJieAogICAgcG9wIHJicAogICAgcmV0Cgo7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo7INCf0YDQvtGG0LXQtNGD0YDQsDogUHJpbnROdW1iZXIKOyDQn9C10YDQtdGC0LLQvtGA0Y7RlCDRh9C40YHQu9C+INCyIFJBWCDRgyDRgNGP0LTQvtC6INGWINC00YDRg9C60YPRlCDQudC+0LPQvgo7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpQcmludE51bWJlcjoKICAgIHB1c2ggcmJ4CiAgICBwdXNoIHJjeAogICAgcHVzaCByZHgKICAgIHB1c2ggcnNpCiAgICBwdXNoIHJkaQoKICAgIG1vdiByY3gsIDAgICAgICAgICAgICAgOyDQm9GW0YfQuNC70YzQvdC40Log0YbQuNGE0YAKICAgIG1vdiByYngsIDEwICAgICAgICAgICAgOyDQlNGW0LvRjNC90LjQuiA9IDEwCgpEaXZpZGVMb29wOgogICAgeG9yIHJkeCwgcmR4ICAgICAgICAgICA7INCe0YfQuNGJ0LDRlNC80L4g0LfQsNC70LjRiNC+0LoKICAgIGRpdiByYnggICAgICAgICAgICAgICAgOyBBWCAvIDEwIC0+IEFYPdGH0LDRgdGC0LrQsCwgRFg90LfQsNC70LjRiNC+0LoKICAgIAogICAgYWRkIGRsLCAnMCcgICAgICAgICAgICA7INCf0LXRgNC10YLQstC+0YDRjtGU0LzQviDRhtC40YTRgNGDINCyIEFTQ0lJICjQvdCw0L/RgNC40LrQu9Cw0LQsIDUgLT4gJzUnKQogICAgcHVzaCByZHggICAgICAgICAgICAgICA7INCX0LHQtdGA0ZbQs9Cw0ZTQvNC+INGG0LjRhNGA0YMg0LIg0YHRgtC10LogKNCx0L4g0L7RgtGA0LjQvNGD0ZTQvNC+INGX0YUg0Lcg0LrRltC90YbRjykKICAgIGluYyByY3ggICAgICAgICAgICAgICAgOyDQoNCw0YXRg9GU0LzQviDQutGW0LvRjNC60ZbRgdGC0Ywg0YbQuNGE0YAKICAgIAogICAgdGVzdCByYXgsIHJheCAgICAgICAgICA7INCv0LrRidC+INGH0LDRgdGC0LrQsCAwLCDQutGW0L3QtdGG0YwKICAgIGpueiBEaXZpZGVMb29wCgogICAgOyDQotC10L/QtdGAINCy0LjQstC+0LTQuNC80L4g0YbQuNGE0YDQuCDQt9GWINGB0YLQtdC60YMKICAgIDsg0KnQvtCxINCy0LjQstC10YHRgtC4LCDRgtGA0LXQsdCwINC30LDQv9C40YHQsNGC0Lgg0ZfRhSDRgyDQsdGD0YTQtdGACiAgICBsZWEgcnNpLCBbbnVtQnVmZmVyXSAgIDsg0JDQtNGA0LXRgdCwINCx0YPRhNC10YDQsAogICAgbW92IHJkaSwgcnNpICAgICAgICAgICA7INCa0L7Qv9GW0Y8g0LDQtNGA0LXRgdC4INC00LvRjyDQt9Cw0L/QuNGB0YMKClBvcExvb3A6CiAgICBwb3AgcmF4ICAgICAgICAgICAgICAgIDsg0JTRltGB0YLQsNGU0LzQviDRhtC40YTRgNGDINC30ZYg0YHRgtC10LrRgwogICAgbW92IFtyZGldLCBhbCAgICAgICAgICA7INCX0LDQv9C40YHRg9GU0LzQviDQsiDQsdGD0YTQtdGACiAgICBpbmMgcmRpICAgICAgICAgICAgICAgIDsg0JfRgdGD0LLQsNGU0LzQviDQstC60LDQt9GW0LLQvdC40Log0LHRg9GE0LXRgNCwCiAgICBsb29wIFBvcExvb3AgICAgICAgICAgIDsg0J/QvtCy0YLQvtGA0Y7RlNC80L4gQ1gg0YDQsNC30ZbQsgoKICAgIDsg0JLQuNC60LvQuNC6IHN5c193cml0ZSDQtNC70Y8g0LLRgdGM0L7Qs9C+INCx0YPRhNC10YDQsAogICAgbW92IHJkeCwgcmRpICAgICAgICAgICA7INCe0LHRh9C40YHQu9GO0ZTQvNC+INC00L7QstC20LjQvdGDOgogICAgbGVhIHJheCwgW251bUJ1ZmZlcl0KICAgIHN1YiByZHgsIHJheCAgICAgICAgICAgOyByZHggPSDQv9C+0YLQvtGH0L3QuNC5IHJkaSAtINC/0L7Rh9Cw0YLQvtC6INCx0YPRhNC10YDQsCAo0LTQvtCy0LbQuNC90LAg0YDRj9C00LrQsCkKICAgIAogICAgbW92IHJheCwgMSAgICAgICAgICAgICA7IHN5c193cml0ZQogICAgbW92IHJkaSwgMSAgICAgICAgICAgICA7IHN0ZG91dCAo0LrQvtC90YHQvtC70YwpCiAgICBsZWEgcnNpLCBbbnVtQnVmZmVyXSAgIDsg0LDQtNGA0LXRgdCwINGC0LXQutGB0YLRgwogICAgc3lzY2FsbAoKICAgIHBvcCByZGkKICAgIHBvcCByc2kKICAgIHBvcCByZHgKICAgIHBvcCByY3gKICAgIHBvcCByYngKICAgIHJldA==